您的位置:首页 > 其它

hdu 1325 Is It A Tree? (并查集)

2017-07-21 13:09 519 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325

题意:可以先参考hdu1272 http://blog.csdn.net/qq_36782366/article/details/75044271
由无向边变为了有向边  判断是否是一颗树

思路:加一个数组 记录入度即可  有一个结点的入度如果大于1 则不成立
#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#include<queue>
#include<cstring>
using  namespace std;
#define maxn 100010
int pre[maxn];
int vis[maxn];
int du[maxn];
int num1,num2;
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j;
while(r!=i)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int n,m;
int cas=1;
while(~scanf("%d%d",&n,&m))
{
int num1=0,num2=0;
for(int i=0;i<maxn;i++)
pre[i]=i;
if(n==-1&&m==-1)break;
if(n==0&&m==0)
{
printf("Case %d is a tree.\n",cas++);
continue;
}
join(n,m);
int flag=0;
memset(vis,false,sizeof vis);
memset(du,0,sizeof du);
if(!vis
)
{
vis
=true;
num1++;
}
if(!vis[m])
{
vis[m]=true;
num1++;
}
if(!du[m])du[m]=1;
else flag=1;
num2++;
while(~scanf("%d%d",&n,&m))
{

if(n==0&&m==0)break;
if(flag)continue;
if(!vis
)
{
vis
=true;
num1++;
}
if(!vis[m])
{
vis[m]=true;
num1++;
}
num2++;
if(!du[m])du[m]=1;
else flag=1;
int fm=find(m);
int fn=find(n);
if(fm!=fn)
pre[fm]=fn;
else flag=1;
}
if(flag||abs(num1-num2)!=1)printf("Case %d is not a tree.\n",cas++);
else printf("Case %d is a tree.\n",cas++);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: