51nod 1307 繩子與重物(並查集水了一發)
阿新 • • 發佈:2017-08-20
spa ons ios set const dfs scanf sin 並查集
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307
題意:
思路:
可以直接二分答案,然後dfs。
因為標簽是並查集,所以我考慮了一下並查集,利用並查集不斷向上回溯加負重,居然過了,只能說數據有點水。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7#include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long ll; 14 const int INF = 0x3f3f3f3f; 15 const int maxn=50000+5; 16 const int mod=1e9+7; 17 18 int n; 19 int p[maxn]; 20 int c[maxn],w[maxn],f[maxn];21 22 int main() 23 { 24 //freopen("in.txt","r",stdin); 25 while(~scanf("%d",&n)) 26 { 27 for(int i=0;i<n;i++) p[i]=i; 28 int ans=n; 29 for(int i=0;i<n;i++) 30 { 31 scanf("%d%d%d",&c[i],&w[i],&f[i]); 32 if(ans!=n) continue; 33 if(f[i]==-1) continue; 34 p[i]=f[i]; 35 int x=i; 36 while(true) 37 { 38 x=p[x]; 39 w[x]+=w[i]; 40 if(w[x]>c[x]) {ans=i;break;} 41 if(x==p[x]) break; 42 } 43 } 44 printf("%d\n",ans); 45 } 46 return 0; 47 }
51nod 1307 繩子與重物(並查集水了一發)