首页 > 代码库 > HDU 1325 Is It A Tree? 并查集
HDU 1325 Is It A Tree? 并查集
判断是否为树
森林不是树
空树也是树
成环不是树
数据:
1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 0 0
1 2 2 3 4 5 0 0
2 5 0 0
ans:
no
no
yes
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std; typedef long long LL; const int maxn =10000+5; const int maxe = 15000+5; const int INF = 460002326; const int mod = 1000000009;//q[i]表示点i 对应的点 rank[i]表示入度 int fa[maxn],q[maxn],rank[maxn],taj,flag;//taj表示当前点的编号个数 void init() { flag=0; taj=1; for(int i=0; i<maxn; i++) fa[i]=i,q[i]=-1,rank[i]=0; } int find(int x) { if(fa[x]==x) return x; else { fa[x]=find(fa[x]); return fa[x]; } } void merge(int x,int y) { int fx=find(x),fy=find(y); if(fx==fy) { flag=1;//重复 return ; } else { fa[fy]=fx; rank[y]++;//入度+1 return ; } } void dian(int a,int b) { if(q[a]==-1) q[a]=taj++; if(q[b]==-1) q[b]=taj++; } int main() { int a,b,cas=0; // freopen("in.txt","r",stdin); while(scanf("%d%d",&a,&b),a+b>=0) { init();//初始化 if(a==0&&b==0)// 0 0 也算树 { printf("Case %d is a tree.\n",++cas); continue; } a=q[a],b=q[b]; merge(a,b); while(scanf("%d%d",&a,&b)) { if(a+b==0) break; dian(a,b); a=q[a],b=q[b]; merge(a,b); } a=0; for(int i=1; i<maxn; i++) find(i); for(int i=1; i<maxn; i++) { if(q[i]!=-1&&fa[q[i]]==q[i])//根节点 a++; if(rank[i]>1) flag=1; } printf("Case %d is ",++cas); if(a==1&&flag==0&&taj>2) puts("a tree."); else puts("not a tree."); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。