| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
全靠自己写AC了,不看讨论和网上的如果看不懂的话,这是种类并查集的做法网上搜一下。
#include <stdio.h>
#define MAXN 100001
int parent[MAXN];
int relation[MAXN];
int count[MAXN];
bool flag[MAXN];
void Initial(int N)
{ for(int i=0;i<=N;++i)
parent[i]=i,relation[i]=0,flag[i]=false,count[i]=1;
}
int FindRoot(int x)
{ if(x!=parent[x])
{ int temp=parent[x];
parent[x]=FindRoot(parent[x]);
relation[x]=(relation[x]+relation[temp])%2;
}
return parent[x];
}
void Union(int i,int j)
{ int x=FindRoot(i),y=FindRoot(j);
if(x==y) return;
if(count[x]>=count[y])
{ parent[y]=x;
count[x]+=parent[y];
relation[y]=(relation[i]+relation[j]-1)%2;
}
else
{ parent[x]=y;
count[y]+=parent[x];
relation[x]=(relation[i]+relation[j]-1)%2;
}
}
int main()
{ int T;
int N,M,i,a,b,x,y;
char c;
scanf("%d",&T);
while(T--)
{ scanf("%d %d",&N,&M);
Initial(N);
while(M--)
{ scanf(" %c %d %d",&c,&a,&b);
flag[a]=flag[b]=true;
if(c=='D')
Union(a,b);
else if(c=='A')
{ if(flag[a]==false||flag[b]==false)
puts("Not sure yet.");
else
{ x=FindRoot(a),y=FindRoot(b);
if(x!=y) puts("Not sure yet.");
else
{ if(relation[a]==relation[b])
puts("In the same gang.");
else
puts("In different gangs.");
}
}
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator