1. 程式人生 > >51nod 1307 繩子與重物(並查集水了一發)

51nod 1307 繩子與重物(並查集水了一發)

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 繩子與重物(並查集水了一發)