您的位置:首页 > 其它

hdu 1325 is it a tree?

2015-01-22 15:27 246 查看
网上一搜全是并查集。。 并查集POJ可以水过,HDU就不行了。。

并查集的话:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int pre[1005];
bool vis[1005];
int num[1005];
bool flag;
int x,y,icase=1;
void init()
{
for(int i=0;i<=1000;i++)
pre[i]=i;
memset(num,0,sizeof(num));
memset(vis,false,sizeof(vis));
flag=false;
}
int find(int x)
{
if(pre[x]!=x)
pre[x]=find(pre[x]);
return pre[x];
}
void judge()
{
for(int i=1;i<=1000;i++)
if(vis[i]) num[find(i)]++;
int key=0;
for(int i=1;i<=1000;i++)
if(num[i]>1) key++;
if(key>1) flag=true;
}
int main()
{
//    freopen("in.txt","r",stdin);
init();
while(1)
{
scanf("%d%d",&x,&y);
if(x<0 && y<0)
break;
else if(x==0 && y==0)
{
judge();
if(flag)
printf("Case %d is not a tree.\n",icase++);
else
printf("Case %d is a tree.\n",icase++);
init();
continue;
}
else
{
vis[x]=vis[y]=true;
if(find(x)==find(y) || pre[y]!=y)
flag=true;
else
pre[y]=x;
}
}
return 0;
}


迪哥代码

有个坑是只要是输入两个负数就结束,不一定是-1 -1

判断图是否为树:1.是否为连通图 2.是否有环

因为题目给的是从父亲指向儿子,所以直接判断点的入度就可以了

#include "iostream"
#include "memory.h"
#include "cstdio"
using namespace std;
#define MAXN 1111
int fa[MAXN];
int in_degree[MAXN];
bool c[MAXN];
bool ok;

int main()
{
int a,b,T = 1;
while (~scanf("%d%d",&a,&b)) {
memset(fa,-1,sizeof(fa));
memset(in_degree,0,sizeof(in_degree));
memset(c,0,sizeof(c));
if (a < 0 && b < 0) break;
c[a] = 1;
c[b] = 1;
in_degree[b]++;
while (~scanf("%d%d",&a,&b),a+b) {
if (a < 0 && b < 0) return 0;
in_degree[b]++;
c[a] = 1;
c[b] = 1;
}
int re = 0;
int ok = 1;
for (int i = 0;i < MAXN; ++ i) if (c[i]){
if (in_degree[i] == 0) re ++;
if (in_degree[i] > 1) ok = 0;
}
if (re == 1 && ok) printf("Case %d is a tree.\n",T);
else printf("Case %d is not a tree.\n",T);
T++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: