并查集应用:
POJ1703 Find them, Catch them
题目大意:一个城市有两个帮派(我猜gngs应该差不多就这个意思吧,,不用在意这些细节啦),对于每组输入,D a b 表示a和b属于不同的帮派,A a b问你a和b是否在同一个帮派,对于每次询问,输出相应的结果即可。
分析:说白了,这题就是简化版的食物链。
和食物链的思想一样,我们用a和a+N表示a在哪个集合,这样,对于输入的D a b,我们只需合并a和b+N所在的集合即可。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 100005
int par[2*MAX],rank[2*MAX];
void Init(int n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
rank[i]=1;
}
}
int Find(int x)
{
while(par[x]!=x)
x=par[x];
return x;
}
void Union(int x,int y)
{
x=Find(x);
y=Find(y);
if(x==y) return ;
if(rank[x]>rank[y])
{
par[y]=x;
rank[x]+=rank[y];
}
else
{
par[x]=y;
rank[y]+=rank[x];
}
}
bool Same(int x,int y)
{
return Find(x)==Find(y);
}
int main()
{
int n,m,a,b;
int T=0;
char w;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
Init(2*n);
while(m--)
{
getchar();
scanf("%c%d%d",&w,&a,&b);
a-=1;
b-=1;
if(w=='A')
{
if(Same(a,b+n)) puts("In different gangs.");
else if(Same(a,b)) puts("In the same gang.");
else puts("Not sure yet.");
}
else
{
Union(a,b+n);
Union(a+n,b);
}
}
}
return 0;
}
POJ2492 A Bug's Life
题目大意:Hopper教授在研究臭虫的性行为,他认为臭虫中只有不同的两性之间才能交配(即他认为臭虫中没有同性恋的存在);然后根据不同的场景,即给出交配的臭虫的编号(从1开始),然后让你判断他的假设是否正确。
这题和上一题几乎一模一样,大致改一下就AC了
#include <cstdio>
#include <iostream>
using namespace std;
#define MAX 2010
int par[2*MAX],rank[2*MAX];
void Init(int n)
{
for(int i=0;i<=n;i++)
{
par[i]=i;
rank[i]=1;
}
}
int Find(int x)
{
if(par[x]!=x)
return par[x]=Find(par[x]);
return par[x];
}
void Union(int x,int y)
{
x=Find(x);
y=Find(y);
if(rank[x]>rank[y])
{
par[y]=x;
rank[x]+=rank[y];
}
else
{
par[x]=y;
rank[y]+=rank[x];
}
}
int main()
{
int n,m,t;
int a,b;
bool flag;
int T=1;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
Init(2*n);
flag=true;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
a-=1;
b-=1;
if(Find(a)==Find(b)) flag=false;
else
{
Union(a,b+n);
Union(a+n,b);
}
}
printf("Scenario #%d:\n",T++);
if(flag) puts("No suspicious bugs found!\n");
else puts("Suspicious bugs found!\n");
}
return 0;
}