团体程序设计天梯赛 L2-010 排座位 (25分)(并查集)

题目链接:

L2-010 排座位 (25分)

思路:

两个人有敌对也有共同的朋友就输出OK but...
朋友的朋友也是朋友;
两个人不可能同时是朋友和敌人;
缓缓打出一个?
言归正传,虽然题意有点迷,但是不要想太多按部就班做就可以;
对于一个朋友集体我们用并查集来维护就好;

代码:

#include<bits/stdc++.h>

using namespace std;

const int maxn = 123;
int n, m, k, rel[maxn][maxn], par[maxn], rk[maxn];

void init_set(int & n) { for(int i = 1; i <= n; par[i] = i, i++); }
int find(int x) {
	if(x == par[x]) return x;
	return par[x] = find(par[x]);	
}
inline void unite(int x, int y) {
	x = find(x);
	y = find(y);
	if(x == y) return;
	if(rk[y] > rk[x]) par[x] = y;
	else {
		par[y] = x;
		if(rk[x] == rk[y]) ++rk[x];
	}
}
inline bool same(int x, int y) {
	return find(x) == find(y);	
}

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif	
	cin >> n >> m >> k;
	init_set(n);
	for(int i = 0; i < m; i++) {
		int x, y, r;
		cin >> x >> y >> r;
		rel[x][y] = rel[y][x] = r;
		if(r == 1) unite(x, y);	
	}
	while(k--) {
		int x, y;
		cin >> x >> y;
		if(rel[x][y] == 1) puts("No problem");
		else if(rel[x][y] == 0) puts("OK");
		else {
			if(same(x, y))  puts("OK but...");	
			else puts("No way");
		}
	}
	return 0;
}
发布了289 篇原创文章 · 获赞 8 · 访问量 6952

猜你喜欢

转载自blog.csdn.net/qq_45228537/article/details/104054168