判断有向根树,并查集,用两个数组,一个bin记录父结点,一个flag记录是否为已有父结点,
用一个数k来标记是否为有向根树。明显,
1.在边的输入过程中如果出现已有父亲结点的点为子结点,则这一定不是有向根树
2.在输入完成后,要检查是否只有一个根结点
就满足这两点,在oj上水过~~了
在与队友的交流中发现时因为数据水的缘
应该需要加一个判断是否有连通分支为圈的情况,考虑不够周全吖!!!
#include<iostream> int bin[100005],flag[100005],k; int find(int x) { while(bin[x]!=x) x=bin[x]; return x; } int merge(int x,int y) { if(flag[y]==0) { bin[y]=x; flag[y]=1; } else { k=0; } return 0; } int main(){ int n,i,x,y,root; n=1; while(scanf("%d %d",&x,&y)&&(x>=0&&y>=0)) { k=1;root=0; for(i=1;i<=100000;i++) { bin[i]=i; flag[i]=0; } if(x==0&&y==0) printf("Case %d is a tree.\n",n++); else { do { merge(x,y); } while(scanf("%d %d",&x,&y)&&(x!=0&&y!=0)); if(k==1) { for(i=1;i<=100000;i++) { if(bin[i]!=i&&flag[bin[i]]==0) flag[bin[i]]=1; } for(i=1;i<=100000;i++) { if(bin[i]==i&&flag[i]==1) root++; } if(root==1) printf("Case %d is a tree.\n",n++); else printf("Case %d is not a tree.\n",n++); } else printf("Case %d is not a tree.\n",n++); } } return 0; }
转载于:https://blog.51cto.com/8590696/1358846