haha,今天在做这道题目得时候看到一个搞笑的题解,haha,给大家看看。
题意 : 就是一个城市有两个帮会,如果不是A帮会就定是B帮会,但是一开始不清楚哪些是自己人...
/*
这道题告诉我们,有什么事找老大说去。。。
还有,我是卖切糕的。。
*/
# include<cstdio>
# include<cstring>
using namespace std;
# define N 100005
int father[N],Rank[N],opp[N]; //opp表示它的敌对势力 =。=
void make_set(int n)
{
int i;
for(i=1;i<=n;i++)
{
father[i]=i;
opp[i]=Rank[i]=0; //刚出道,没有敌对势力
}
}
int find(int r) //小弟全部得跟老大姓
{
if(father[r]!=r)
father[r]=find(father[r]);
return father[r];
}
void merge(int a,int b) //a,b成一家
{
a=find(a);
b=find(b);
if(a==b)
return;
if(Rank[a]>Rank[b])
father[b]=a;
else
{
father[a]=b;
if(Rank[a]=Rank[b])
Rank[b]++;
}
}
int main()
{
int i,n,m,a,b,t,head_a,head_b;
char op[10];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
make_set(n);
for(i=1;i<=m;i++)
{
scanf("%s%d%d",op,&a,&b);
head_a=find(a); //找出他们各自的老大
head_b=find(b);
if(op[0]=='A')
{
if(head_a==head_b) //同一个势力,兄弟见面了
printf("In the same gang.\n"); //哥俩好呀!
else if(head_a==find(opp[head_b])) //什么,你不认识我? |-- 没关系,我认识你们一个人的老大就是他(我情敌的老大就是你,所以你就是我敌人)
printf("In different gangs.\n"); //去你丫的!!!
else
printf("Not sure yet.\n"); //大哥,我什么都不知道啊
}
else
{
if(opp[a]==0) //没有敌对势力,毕竟刚出道嘛
opp[a]=head_b; //他的敌对势力就是b所在的势力
if(opp[b]==0) //纯洁的孩子啊
opp[b]=head_a; //就看你不爽,咋地~~~~
merge(a,opp[head_b]); //加到自己的势力去,投靠老大去了(自己的势力就是b敌对的势力)
merge(b,opp[head_a]); //大哥,我来了。。。。。
}
}
}
return 0;
}
代码来源 :
rdy2012