团体程序设计天梯赛 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;
}