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

//POJ 1703 几乎和POJ2492一模一样,不再对并查集的建立做解释
//参考POJ2492的注释

View Code
1 #include<iostream>
2 usingnamespace std;
3 /**********************************************************/
4 int p[100010],r[100010];
5 int T,N,M,a,b;
6 char flag;
7 /**********************************************************/
8 void make(){
9 for(int i=1;i<=N;i++){
10 p[i]=i;
11 r[i]=0;
12 }
13 }
14 /**********************************************************/
15 int find(int x){
16 int temp=p[x];
17 if(x==p[x])return x;
18
19 p[x]=find(p[x]);
20 r[x]=(r[x]==r[temp])?0:1;
21 return p[x];
22 }
23 /**********************************************************/
24 void unionSet(int x,int y,int px,int py){
25 p[px]=py;
26 r[px]=(r[x]==r[y])?1:0;
27 }
28 /**********************************************************/
29 int main(){
30 cin>>T;
31 while(T--){
32 cin>>N>>M;
33 make();
34 while(M--){
35 //cin>>flag>>a>>b;
36 //第一次有cin超时
37 //大输入用scanf()记得加那个"\n"
38 scanf("\n%c%d%d",&flag,&a,&b);
39 int pa=find(a),
40 pb=find(b);
41 if(flag=='A'){
42 //父亲不同,说明到此句还没有建立关系
43 if(pa!=pb){
44 cout<<"Not sure yet."<<endl;
45 continue;
46 }
47 //父亲相同,在通过比较两者和父亲的关系
48 //就可以退出他们彼此之间的关系
49 if(r[a]==r[b]){
50 cout<<"In the same gang."<<endl;
51 continue;
52 }
53 cout<<"In different gangs."<<endl;
54 continue;
55 }
56 //上面每句都有continue所以不用else限定
57 //能走到此句说明上面都不行
58 if(flag=='D'){
59 if(pa!=pb)unionSet(a,b,pa,pb); } }/*for(int i=1;i<=N;i++)cout<<p[i]<<" ";
60 cout<<endl;*/
61 }
62 return0;
63
64 }
posted on 2011-04-26 22:35  geeker  阅读(401)  评论(0编辑  收藏  举报