这几天迷上并查集了~~~~~
这道题意思是,n个点用n-1条边使得其连通,类似于树,只不过是无相的。
判断原则: (1)最后的图中只能有一个根节点,也就是只有一个点的父节点是其本身
(2)不能存在环,也就是说拥有同一祖先的节点之间不能并
附上代码:
这是这道题的代码,但是另人奇怪的是 杭电的1325题 跟着题差不多,只不过多了一个 判断条件:及每个子节点的入读只能为一:我把这个代码改了改 再提交与1325题,竟然re了很多次,实在是不解。。
#include <iostream> #include <stdio.h> using namespace std; int f[100100],visit[100100],flag; int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } void make(int a,int b) { int f1=find(a); int f2=find(b); if(f2!=f1) f[f2]=f1; else flag=0; } int main() { int a,b,max=0; while(cin>>a>>b) { if(a==-1&&b==-1)break; if(a==0&&b==0) { printf("Yes\n"); continue; } for(int i=1;i<=100010;i++) { f[i]=i; visit[i]=0; } flag=1; max=0; visit[a]=visit[b]=1; if(a>max)max=a; if(b>max)max=b; make(a,b); while(cin>>a>>b) { if(a==0&&b==0)break; visit[a]=visit[b]=1; if(a>max)max=a; if(b>max)max=b; make(a,b); } if(!flag) { printf("No\n"); continue; } int k=0; for(int i=1;i<=max;i++) { if(visit[i]&&f[i]==i) k++; if(k>1)break; } if(k>1) printf("No\n"); else printf("Yes\n"); } return 0; }