Source Code</p><p>Problem: 1182 User: zhouxc<br />Memory: 980K Time: 422MS<br />Language: G++ Result: Accepted </p><p>Source Code<br />#include "iostream"</p><p>using namespace std;<br />int n,m,x,y,c,test,dist;<br />int p[50001],rank[50001],level[50001];</p><p>void Make_set()<br />{</p><p> for(int i=1;i<=n;i++)<br /> {<br /> p[i]=i;<br /> rank[i]=0;<br /> level[i]=0;<br /> }<br />} </p><p>int Find_set(int a)<br />{<br /> if(p[a]!=a)<br /> {<br /> dist+=level[a];<br /> return Find_set(p[a]);<br /> }<br /> else return p[a];<br />}<br />int Union(int c1,int c2)<br />{<br /> dist=0;<br /> int a=Find_set(c1);<br /> int dist1=dist%3;<br /> dist=0;<br /> int b=Find_set(c2);<br /> int dist2=dist%3;<br /> // cout<<a<<" "<<b<<endl;<br /> // cout<<dist1<<" "<<dist2<<endl; cout<<"**********"<<endl;<br /> if(c==1)<br /> {<br /> if(a==b)<br /> {<br /> if(dist1==dist2)<br /> return 1;<br /> else<br /> return 0;<br /> }<br /> else<br /> {<br /> if(rank[a]>rank[b])<br /> {<br /> p[b]=a;<br /> level[b]=(dist1-dist2+3)%3;<br /> }<br /> else if(rank[a]<rank[b])<br /> {<br /> p[a]=b;<br /> level[a]=(dist2-dist1+3)%3;<br /> }<br /> else<br /> {<br /> p[b]=a;<br /> rank[a]++;<br /> level[b]=(dist1-dist2+3)%3;<br /> }<br /> }<br /> }<br /> else<br /> {<br /> if(a==b)<br /> {<br /> if((dist1-dist2+3)%3==2)<br /> return 1;<br /> else<br /> return 0;<br /> }<br /> else<br /> {<br /> if(rank[a]>rank[b])<br /> {<br /> p[b]=a;<br /> level[b]=(dist1-dist2+4)%3;<br /> }<br /> else if(rank[a]<rank[b])<br /> {<br /> p[a]=b;<br /> level[a]=(dist2-dist1+5)%3;<br /> }<br /> else<br /> {<br /> p[b]=a;<br /> rank[a]++;<br /> level[b]=(dist1-dist2+4)%3;<br /> }<br /> }<br /> }<br /> return 1;</p><p>}<br />int main()<br />{</p><p> int mistake=0;<br /> scanf("%d%d",&n,&m);<br /> Make_set();<br /> for(int i=1;i<=m;i++)<br /> {<br /> scanf("%d%d%d",&c,&x,&y);<br /> if(x>n||y>n)<br /> mistake++;<br /> else<br /> if(!Union(x,y))<br /> mistake++;<br /> }<br /> printf("%d/n",mistake); </p><p> return 0; </p><p>} </p><p>