http://poj.org/problem?id=1182

 /********************************************************
此道题目 前天看的时候一点头绪都没有,看了他人的解题报告后
也几乎看不懂,但是首先做了两道并查集的基础题目POJ1611,与
POJ2524,熟悉并查集的结构,又做了两道并查集的拓展题目
POJ2492与1703,,在充分了解并可以熟悉运用并查集后,此题
便可迎刃而解了,也通过此题发现了自学的诀窍“循序渐进”,
刚刚AC掉食物链问题,有些小激动,遂发此感慨,呵呵~~~
********************************************************/

View Code
1 #include<iostream>
2 usingnamespace std;
3
4 int N,K,relation,a,b,count;
5 int p[50010],r[50010];//p[]为父亲数组,
6 //r[]为x与p[x]的关系数组
7 //0代表同类,1代表x吃父亲p[x]
8 //1代表父亲p[x]吃x
9
10 /*******************************************************/
11 //初始化函数
12 void make(){
13 for(int i=1;i<=N;i++){
14 p[i]=i;
15 r[i]=0;
16 }
17 }
18 /******************************************************/
19 //查找根节点(祖宗)的函数,采用递推压缩路径
20 //使得每一个节点都指向祖宗
21 int find(int x){
22 int temp=p[x];//p[x]之后要被修改,先记下x的父亲值
23 if(x==p[x])return p[x];
24
25 p[x]=find(p[x]);//递推压缩路径,都指向了根节点
26 r[x]=(r[x]+r[temp])%3;//关系修改
27
28 return p[x];
29 }
30 /*******************************************************/
31 //合并
32 void unionSet(int x,int y,int px,int py){
33 p[px]=py;
34 r[px]=(r[y]-r[x]+3+relation-1)%3;
35 //关于三处的关系修改于判断,本人一开始采用枚举的方式,
36 //不过如果枚举的话,每次使用倒要if(3*3=)九次,很是
37 //啰嗦,之后总结出公式,不过可以用进行严格向量法证明
38 /*
39 if(relation==1){
40 //r[px]=(r[y]-r[x])%3;
41 if(r[x]==r[y]){r[px]=0;return;}
42 if(r[x]==0){r[px]=r[y];return;}
43 if(r[y]==0){r[px]=r[x];return;}
44 if(r[x]==1){r[px]=1;return;}
45 if(r[y]==1){r[px]=2;return;}
46 }
47 if(relation==2){
48 //r[px]=(r[y]-r[x]+1)%3;
49
50 if(r[x]==0&&r[y]==0){}
51 if(r[x]==0&&r[y]==1){}
52 if(r[x]==0&&r[y]==2){}
53 if(r[x]==0&&r[y]==)
54 */
55 }
56
57 /*******************************************************/
58 int main(){
59 cin>>N>>K;
60 int pa,pb;
61 count=0;
62 make();
63 while(K--){
64 scanf("\n%d%d%d",&relation,&a,&b);
65 pa=find(a);
66 pb=find(b);
67 //输入数据有矛盾可以直接判断
68 if(a>N||b>N||(relation==2&&a==b)){count++;continue;}
69 //pa!=pb,则说明,a与b还未建立关系,所以肯定不会
70 //产生矛盾
71 if(pa!=pb){unionSet(a,b,pa,pb);continue;}
72 //如果产生关系,但是根据已存在的r[a]与r[b]算出的
73 //a与b之间的关系与输入的relation不相符,则矛盾
74 if((r[a]-r[b]+3)%3!=(relation-1)){count++;continue;}
75 }
76 cout<<count<<endl;
77 }
posted on 2011-04-26 22:37  geeker  阅读(696)  评论(0编辑  收藏  举报