题意:就是给出一张无相图,判断有没有回路
思路:对于无向图判环问题,可以采用dfs染色或则并查集的方式
如果使用并查集的话,如果存在环即在某次 将某边的两个结点 进行比较,如果发现已经在同一个集合则说明存在环
完整代码:
#include<cstdio> #include<iostream> #include<cstring> const int maxn = 1e5+5; using namespace std; int flag; int pre[maxn]; int vis[maxn]; int find(int x) { if(x!=pre[x]) return pre[x] = find(pre[x]); else return pre[x]; } void unite(int x,int y) { int fx=find(x),fy=find(y); if(fx!=fy) pre[fy]=fx; else flag = 0; } void init(){ for(int i=0;i<maxn;i++){ pre[i]=i;vis[i]=0; flag=1; } } int main() { int a,b; while(~scanf("%d%d",&a,&b)){ if(a==-1&&b==-1) break; if(a==0&&b==0){ printf("Yes "); continue; } init(); unite(a,b); vis[a]= vis[b] = 1; while(scanf("%d%d",&a,&b)&&a&&b){ unite(a,b); vis[a]=1; vis[b]=1; } if(flag==0){ printf("No "); continue; } else{ int cont=0; for(int i=0;i<=maxn;i++){ if(vis[i]&&pre[i]==i) cont++; } if(cont==1){ printf("Yes "); }else{ printf("No "); } } } }