poj1308
来源:互联网 发布:手机淘宝怎么借钱 编辑:程序博客网 时间:2024/06/05 20:54
#include<stdio.h>
#include<string.h>//判断是否有环,判断是否是一个根节点。判断空树的情况
#define N 1000000
int pre[N+10],dis[N+10],degree[N+10];
int find(int n) {
return pre[n]=n==pre[n]?n:find(pre[n]);
}
int main() {
int a,b,cnt,flag,f1,f2,i,min,max,k=0,w,u;
while(scanf("%d%d",&a,&b),a!=-1||b!=-1) {
if(a==0&&b==0) {//和杭电不一样他是一个树刚开始错在这
printf("Case %d is a tree.\n",++k);
continue;
}
for(i=1;i<=N;i++)
pre[i]=i;
f1=find(a);
f2=find(b);
degree[a]++;
pre[f2]=f1;
dis[a]=dis[b]=1;
min=a>b?b:a;
max=a>b?a:b;
w=0;
if(min==max)//与节点自身相连不是一棵树
w=1;
flag=0;
while(scanf("%d%d",&a,&b),a||b) {
degree[a]++;
if(a==b)
w=1;
f1=find(a);
f2=find(b);
if(f1==f2)
flag=1;
else
pre[f2]=f1;
dis[a]=dis[b]=1;
min=min<a?min:a;
min=min<b?min:b;
max=max>a?max:a;
max=max>b?max:b;
}
if(flag||w) {
printf("Case %d is not a tree.\n",++k);
continue;
}
cnt=0;u=0;
/* for(i=min;i<=max;i++)
if(degree[i]>cnt)
cnt=degree[i];
for(i=min;i<=max;i++)
if(cnt==degree[i])
u++;
if(u>1) {
printf("Case %d is not a tree.\n",++k);
continue;
}*/
cnt=0;
for(i=min;i<=max;i++)
if(pre[i]==i&&dis[i])
cnt++;
if(cnt==1)
printf("Case %d is a tree.\n",++k);
else
printf("Case %d is not a tree.\n",++k);
}
return 0;
}//测试数据1: 0 0 空树是一棵树
//2: 1 1 0 0 不是树 不能自己指向自己
//3: 1 2 1 2 0 0 不是树....自己开始一直在这么WA 好郁闷 重复都不行呀~~5555
//4: 1 2 2 3 4 5 不是树 森林不算是树(主要是注意自己)
//5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 注意 一个节点在指向自己的父亲或祖先 都是错误的 即 9-->1 错
//6: 1 2 2 1 0 0 也是错误的
#include<string.h>//判断是否有环,判断是否是一个根节点。判断空树的情况
#define N 1000000
int pre[N+10],dis[N+10],degree[N+10];
int find(int n) {
return pre[n]=n==pre[n]?n:find(pre[n]);
}
int main() {
int a,b,cnt,flag,f1,f2,i,min,max,k=0,w,u;
while(scanf("%d%d",&a,&b),a!=-1||b!=-1) {
if(a==0&&b==0) {//和杭电不一样他是一个树刚开始错在这
printf("Case %d is a tree.\n",++k);
continue;
}
for(i=1;i<=N;i++)
pre[i]=i;
f1=find(a);
f2=find(b);
degree[a]++;
pre[f2]=f1;
dis[a]=dis[b]=1;
min=a>b?b:a;
max=a>b?a:b;
w=0;
if(min==max)//与节点自身相连不是一棵树
w=1;
flag=0;
while(scanf("%d%d",&a,&b),a||b) {
degree[a]++;
if(a==b)
w=1;
f1=find(a);
f2=find(b);
if(f1==f2)
flag=1;
else
pre[f2]=f1;
dis[a]=dis[b]=1;
min=min<a?min:a;
min=min<b?min:b;
max=max>a?max:a;
max=max>b?max:b;
}
if(flag||w) {
printf("Case %d is not a tree.\n",++k);
continue;
}
cnt=0;u=0;
/* for(i=min;i<=max;i++)
if(degree[i]>cnt)
cnt=degree[i];
for(i=min;i<=max;i++)
if(cnt==degree[i])
u++;
if(u>1) {
printf("Case %d is not a tree.\n",++k);
continue;
}*/
cnt=0;
for(i=min;i<=max;i++)
if(pre[i]==i&&dis[i])
cnt++;
if(cnt==1)
printf("Case %d is a tree.\n",++k);
else
printf("Case %d is not a tree.\n",++k);
}
return 0;
}//测试数据1: 0 0 空树是一棵树
//2: 1 1 0 0 不是树 不能自己指向自己
//3: 1 2 1 2 0 0 不是树....自己开始一直在这么WA 好郁闷 重复都不行呀~~5555
//4: 1 2 2 3 4 5 不是树 森林不算是树(主要是注意自己)
//5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 注意 一个节点在指向自己的父亲或祖先 都是错误的 即 9-->1 错
//6: 1 2 2 1 0 0 也是错误的
- POJ1308
- poj1308
- poj1308
- poj1308
- poj1308
- poj1308
- poj1308
- POJ1308-并查集
- POJ1308 是不是树
- POJ1308解题报告
- Poj1308 并查集
- 并查集POJ1308
- poj1308 2010.2.8
- poj1308(并查集判环)
- poj1308【并查集】
- poj1308 并查集
- poj1308 Is It A Tree?
- poj1308:Is It A Tree?
- J2EE Listener/Servlet/Filter相关应用和问题
- [算法][LeetCode]Single Number——异或运算的巧妙运用
- web.xml文件的作用
- iOS7 隐藏status Bar
- 【递推】多米诺骨牌
- poj1308
- 暗时间 书评
- 答一名大三同学的信——我该不该做项目
- net.sf.json.JSONException: There is a cycle in the hierarchy
- Unity3D 200个插件免费分享
- 浅谈linux驱动(3)-linux系统下led驱动2012年02月21日 23:13:52
- struts2源代码分析
- hdu 1213
- Java安全编程:DES加密解密