hdu 1272

emmm,输入坑,输出也坑。因为搞错了大小写,wa了4次。

记录一个坑点,不要只判断是否“成环”还要判断是不是所有的点都被连起来了

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int N = 100100;

int pre[N];
bool vis[N];

int find(int x){
	int r = x;
	while(r != pre[r])
		r = pre[r];
	int i = x, j;
	while(i != r){
		j = pre[i];
		pre[i] = r;
		i = j;
	}
	return r;
}

void join(int x, int y){
	int f1 = find(x), f2 = find(y);
	if(f1 != f2)
		pre[f2] = f1;
}

int main(){
	int a, b;
	while(~ scanf("%d%d", &a, &b)){
		if(a == 0 && b == 0){
			cout << "Yes" << endl;
			continue ;
		}
		if(a == -1 && b == -1)
			break;
		for(int i = 1; i <= N; i ++)
			pre[i] = i;
		memset(vis, false, sizeof(vis));
		vis[a] = vis[b] = true;
		join(a, b);
		int c, d;
		bool flag = false;
		int x = 0;
		while(scanf("%d%d", &c, &d)){
			if(c == 0 && d == 0)
				break;
			vis[c] = vis[d] = true;
			if(find(c) == find(d))
				flag = true;
			else{
				join(c, d);
				x = c;
			}
		}
		int t = find(x);
		for(int i = 1; i <= N; i ++){
			if(vis[i]){
				if(find(i) != t)
					flag = true;
			}
		}
		if(flag)
			cout << "No" << endl;
		else
			cout << "Yes" << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/80179414