链接:http://poj.org/problem?id=1182
并查集的一道经典题目,主要是处理两个之间的关系的时候比较难想,也比较麻烦
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #define N 50005 4 struct node 5 { 6 int p; 7 int r; 8 }; 9 node f[N]; 10 int n; 11 void init() 12 { 13 int i; 14 for(i=1;i<=n;i++) 15 { 16 f[i].p=i; 17 f[i].r=0; 18 } 19 } 20 int find(int x) 21 { 22 if(f[x].p==x) 23 return x; 24 int temp=f[x].p; 25 f[x].p=find(temp); 26 f[x].r=(f[temp].r+f[x].r)%3; 27 return f[x].p; 28 } 29 void uni(int x,int y,int sx,int sy,int d) 30 { 31 f[sy].p=sx; 32 f[sy].r=(3+(d-1)+f[x].r-f[y].r)%3; 33 } 34 int main() 35 { 36 int d,a,b,m; 37 int i,j,k; 38 scanf("%d%d",&n,&m); 39 init(); 40 int num=0; 41 while(m--) 42 { 43 scanf("%d%d%d",&d,&a,&b); 44 if(a>n||b>n) 45 { 46 num++; 47 continue; 48 } 49 int pa=find(a); 50 int pb=find(b); 51 if(pa!=pb) 52 uni(a,b,pa,pb,d); 53 else 54 { 55 if(d==1&&f[a].r!=f[b].r) 56 num++; 57 else if(d==2&&(f[b].r-f[a].r+3)%3!=1) 58 num++; 59 } 60 } 61 printf("%d\n",num); 62 return 0; 63 }