HDU3038
好题
转载解析:https://blog.csdn.net/yjr3426619/article/details/82315133
1 #include<iostream> 2 using namespace std; 3 int n,m,f[200100],s[200100],ans; 4 5 void ini(){ 6 for (int i=0;i<=n;i++){ 7 f[i]=i; 8 s[i]=0; 9 } 10 ans=0; 11 } 12 13 int getf(int u){ 14 if (u!=f[u]){ 15 int tmp=f[u]; 16 f[u]=getf(f[u]); 17 s[u]+=s[tmp]; 18 } 19 return f[u]; 20 } 21 22 void merge(int l,int r,int v){ 23 int lf=getf(l),rf=getf(r); 24 if (lf==rf){ 25 if ((v+s[r])!=s[l]) ans++; 26 return; 27 } 28 f[lf]=rf; 29 s[lf]=-s[l]+v+s[r]; 30 } 31 32 int main() 33 { 34 while (cin>>n>>m){ 35 ini(); 36 while (m--){ 37 int l,r,v; 38 cin>>l>>r>>v; 39 l--; 40 merge(l,r,v); 41 } 42 cout<<ans<<endl; 43 } 44 return 0; 45 }

浙公网安备 33010602011771号