Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 986 Accepted Submission(s): 452
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5606
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 using namespace std; 5 #define N 100006 6 int n; 7 int fa[N]; 8 int num[N]; 9 void init(){ 10 for(int i = 0; i < N; i++) fa[i] = i; 11 } 12 int find(int x){ 13 return fa[x]==x?x:fa[x]=find(fa[x]); 14 } 15 void merge(int x, int y){ 16 int root1 = find(x); 17 int root2 = find(y); 18 if(root1==root2) return; 19 fa[root1] = root2; 20 } 21 22 int main() 23 { 24 int t; 25 scanf("%d",&t); 26 while(t--) 27 { 28 init(); 29 scanf("%d",&n); 30 for(int i = 0; i < n-1; i++) 31 { 32 int a, b, c; 33 scanf("%d%d%d",&a,&b,&c); 34 if(c==0){ 35 merge(a,b); 36 } 37 } 38 memset(num,0,sizeof(num)); 39 for(int i = 1; i <= n; i++) 40 { 41 int r = find(i); 42 num[r]++; 43 } 44 int ans = 0; 45 for(int i = 1; i <= n; i++) 46 { 47 ans = (ans^num[find(i)]); 48 } 49 printf("%d\n",ans); 50 } 51 return 0; 52 }
原文:http://www.cnblogs.com/shanyr/p/5203299.html