您的位置:首页 > 其它

POJ 1308 并查集的水题

2013-07-22 12:39 211 查看
很水的题,注意判一下森林即可。。。

#include<iostream>
#include<cstdio>
#include<queue>
#define size_num 11200
using namespace std;
queue<int> que;
int p[size_num];
int findp(int x){return p[x]==x?x:p[x]=findp(p[x]);}
int deal()
{
int a,b,f=1;
static int cas=0;
cin>>a>>b;
int root=b;
if(a==-1&&b==-1) return 0;
for(int i=1;i<=10200;i++) p[i]=i;//初始化并查集
while(a&&b)
{
int x=findp(a),y=findp(b);
root=findp(root);
if(x==y) f=0;
p[x]=y;
if(root!=y)
que.push(y);
cin>>a>>b;
}
while(!que.empty())//判森林的步骤
{
root=findp(root);
int temp=que.front();que.pop();
if(root!=findp(temp))
f=0;
}
if(f)
printf("Case %d is a tree.\n",++cas);
else
printf("Case %d is not a tree.\n",++cas);
return 1;
}
int main()
{
while(deal());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息