POJ 1308 Is It A Tree?
2013-08-03 21:10
274 查看
并查集水题,刚开始做并查集,错误次数有点多...交20+发,大多RE。以下为代码,注意的地方已标出
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define INF 1000000000 #define max_N 100005 int par[max_N+5];//为初始化不越界故+5 int rank[max_N+5]; void init(int n) { int i; for(i=0;i<=n;i++) { par[i]=i; rank[i]=0; } } int find(int x) { if(par[x]==x)return x; else return par[x]=find(par[x]); } void uni(int x,int y) { x=find(x); y=find(y); if(x==y)return; if(rank[x]<rank[y])par[x]=y; else { par[y]=x; if(rank[x]==rank[y])rank[x]++; } } int jud(int x,int y) { return find(x)==find(y); } int v[max_N+5]; int main() { int num=1,flag,x,i,k,flag2; int n,m; while(1) { k=0; init(max_N+1);//初始化注意不要越界 flag=0;flag2=0;//一开始将x初始化为INF了,直接导致RE。0 0数据会导致x=INF,导致RE while(1) { scanf("%d%d",&n,&m); if(n==0&&m==0)break;//此处break不能后置,否则v[0]也被记录导致后面查询根节点时,误以为0为另外一颗树 if(n==-1&&m==-1)break; v[k]=n;v[k+1]=m;k=k+2; if(n==m)flag=1; if(find(n)==m)flag=1; if(find(m)==m){uni(n,m);if(flag2==0)x=n;flag2=1;}//本来以为uni(n,m);可以用par[m]=n;代替,但是超内存...par[m]=find(n);正确。不明白为什么超内存...先过去吧 else {flag=1;} } if(n==-1&&m==-1)break; x=find(x); for(i=0;i<k;i++) { if(find(v[i])!=x){flag=1;break;} } if(flag)printf("Case %d is not a tree.\n",num++); else printf("Case %d is a tree.\n",num++); } return 0; }
相关文章推荐
- POJ 1308 Is It A Tree?
- POJ1308 Is It A Tree?(树,并查集)
- POJ1308——Is It A Tree?
- POJ 1308 Is It A Tree?
- poj 1308 Is It A Tree?
- POJ-1308-Is It A Tree?
- POJ 1308 Is It A Tree?
- poj 1308 is it a tree?(图的性质||基础并查集) (同hdu 1272 小希的迷宫 )
- POJ 1308 Is it a tree??
- poj 1308 Is It A Tree?
- poj 1308 Is It A Tree?
- poj 1308 Is It A Tree?(并查集)
- HDU 1325&&POJ 1308 Is It A Tree? (并差集)
- POJ1308 Is It A Tree?
- poj 1308 Is it a Tree?
- POJ 1308 Is it a tree??
- poj 1308 Is It A Tree?
- Is It A Tree?(POJ_1308)
- poj 1308 Is It A Tree?
- POJ1308 Is It A Tree?