题目链接如下所示:
这题其实思路上比较简单:
第一,对于一组数据只要判断每两个数字是否在同一个集合里边就行,如果输入的两个数在一个集合里边了,说明形成了回路。
第二,由于每个点之间都要能走通,我们要判断这个图形的连通分量是否是一。
第三,对于只有0 0这样的一对输入来说,我们要输出Yes。
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<list>
#include<vector>
#include<string>
#include<iostream>
#include<ctime>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<set>
using namespace std;
const int MAXN = 100001;
int s[MAXN];
int x,y;
void init_s(){
for (int i = 1; i < MAXN; ++i) {
s[i]=i;
}
}
int find_s(int x){
return x == s[x] ? x : s[x] = find_s(s[x]);
}
bool same(int x, int y){
return find_s(x) == find_s(y);
}
void union_s(int x,int y){
x = find_s(x);
y = find_s(y);
if (x!=y){
s[y]=x;
}
}
int main() {
bool flag=true;
init_s();
set<int> se;
int sum=1;
while (scanf("%d %d",&x,&y)){
// cout<<"x, y:"<<x<<","<<y<<endl;
// cout<<"flag:"<<flag<<endl;
if (x==-1 && y==-1) break;
if (x==0 && y==0){
// cout<<"flag:"<<flag<<",se.size:"<<se.size()<<",sum:"<<sum<<endl;
if (sum==1 && x==0 && y==0) {
printf("Yes\n");
}else if (!flag||se.size()!=sum){
printf("No\n");
}else{
printf("Yes\n");
}
init_s();
sum=1;
se.clear();
flag=true;
continue;
}
sum++;
if (!flag){
continue;
}
if (same(x,y)){
flag = false;
}else{
union_s(x,y);
se.insert(x);
se.insert(y);
}
}
return 0;
}