小希的迷宫
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 51951 Accepted Submission(s): 16206
![](https://i-blog.csdnimg.cn/blog_migrate/ce3d27d9f95d7ac87d47240232e2e0ba.jpeg)
整个文件以两个-1结尾。
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No题意:判断一组数据是否是无向连通图,并且每两个点只有唯一的一条路径可达思路:用并查集判断代码:#include<stdio.h>
int f[100010],book[100010],sum;
int getf(int v) { if(f[v]==v) return v; else { //路径压缩 f[v]=getf(f[v]); return f[v]; } }
void merge(int m,int n) { int t1,t2; t1=getf(m); t2=getf(n); if(t1!=t2) { f[t2]=t1; //靠左原则 } else sum=0; //标记sum的值为0 }
int main() { int m,n; while(~scanf("%d%d",&m,&n)) {
if(m==-1&&n==-1) break; if(n==0&&m==0) { printf("Yes\n"); continue; } for(int i=0; i<100010; i++) { f[i]=i; book[i]=0; //赋初值 } sum=1; merge(m,n); book[m]=1; book[n]=1; //对输入的每两个顶点进行标记 while(~scanf("%d%d",&m,&n)) { if(n==0&&m==0) break; merge(m,n); book[m]=1; book[n]=1; } if(sum==0) { printf("No\n"); continue; } else { int k=0; for(int i=0; i<100010; i++) { if(f[i]==i&&book[i]) k++; //判断是否还有f[i]=i,并且未被标记 //if(k>1) //若k<=1,表示数为连通图,输出Yes //sum=0; } if(k==1) //若只有一个满足题意,说明为连通图 printf("Yes\n"); else printf("No\n"); }
} return 0; }