您的位置:首页 > 其它

Hdu 1325 Is It ATree? -- 树形 (并查集,入度出度)

2013-09-30 11:03 387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325

题意:给一些有向边,判断是否是一棵树

分析:1>将边看成无向边,用并查集判断是否成树形,边数==点数-1。

2>根据有向边记录每个结点的出入度,有向树里只有1个入度为0的点。

 

#include <stdio.h>
#include <string.h>
const int MAX = 1005;
int ind[MAX],oud[MAX];
int parent[1005];
int tree[1005];
int root(int v)
{
if(parent[v]==0) return v;
else return parent[v]=root(parent[v]);
}
int main()
{
int edge,node;
int a,b,i,k=1;
int j=0,all = 0;
edge=0;node=0;
memset(parent,0,sizeof(parent));
memset(tree,0,sizeof(tree));
memset(ind,0,sizeof(ind));
memset(oud,0,sizeof(oud));
while(scanf("%d %d",&a,&b)!=EOF)
{
if(a+b !=0){
tree[all++]=a;            tree[all++]=b;
ind[b]++;    oud[a]++;
}
if(a<0) break;
else if(node==0&&edge==0&&a==0&&b==0)
{
printf("Case %d is a tree.\n",k++);
memset(parent,0,sizeof(parent));
memset(tree,0,sizeof(tree));
memset(ind,0,sizeof(ind));
memset(oud,0,sizeof(oud));
edge=0;node=0;all=0;
continue;
}
else if(a==0&&b==0)
{
for(j=0;j<all;j++)
{
for(i=j+1;i<all;i++)
{
if(tree[j]==tree[i]) tree[i]=0;
}
}
int num=0;
for(j=0;j<all;j++)
{
if(tree[j]!=0)
{
if(ind[tree[j]] == 0)num++;
node++;
}
}
if(edge==node-1&&num==1)
{
printf("Case %d is a tree.\n",k++);
}
else
printf("Case %d is not a tree.\n",k++);
memset(parent,0,sizeof(parent));
memset(ind,0,sizeof(ind));
memset(oud,0,sizeof(oud));
memset(tree,0,sizeof(tree));
edge=0;node=0;all=0;
}
else
{
int pa,pb;
pa = root(a);
pb = root(b);
if(pa!=pb) parent[pa] = pb;
edge++;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: