题目链接:点击查看
可以说是模板题了,思路就是如果有两条路,那么第二条路一定是将两个已经连接在一起的点再次连接了。
前几天才写过,比赛的时候就又不会了,咯咯。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int f[110000],visit[110000];
int find(int x){
int r = x,i,j;
while(f[r] != r)
r = f[r];
i = x;
while(f[i] != r){
j = f[i];
f[i] = r;
i = j;
}
return r;
}
bool merga(int a,int b){
int f1 = find(a);
int f2 = find(b);
if(f1 != f2){
f[f1] = f2;
return false;
}
return true;
}
int main(void){
int m,n,flag;
while(cin>>n>>m){
flag = 0;
for(int i=1;i<=110000;i++){
f[i] = i;
visit[i] = 0;
}
if(n+m==0){
printf("Yes\n");
continue;
}
if(n+m==-2) break;
merga(n,m);
visit[n] = visit[m] = 1;
while(cin>>n>>m){
if(n+m==0) break;
visit[n] = visit[m] = 1;
if(merga(n,m)) //再次连接时进入if语句
flag = 1;
}
int cnt = 0;
for(int i=1;i<=110000;i++){
if(visit[i] && f[i] == i)
cnt++;
}
if(cnt != 1) flag = 1; //保证连通性
if(flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}