PAT天梯赛题目集:Level2-010 排座位【并查集】
传送门 : https://www.patest.cn/contests/gplt/L2-010
朋友之间的关系和敌对的关系分别用并查集和二维数组储存。
AC code :
#include <iostream> #define MAXN 110 using namespace std; int pre[MAXN]; bool Enemy[MAXN][MAXN]; int Find(int pos) { int r = pos; while (r != pre[r]) r = pre[r]; int i = pos; while (i != r) { int t = pre[i]; pre[i] = r; i = t; } return r; } void Join(int posX, int posY) { int rootX = Find(posX), rootY = Find(posY); if (rootX != rootY) pre[rootX] = rootY; } int main() { int N, M, K; cin >> N >> M >> K; for (int i = 1; i <= N; ++i) pre[i] = i; int tA, tB, ship; while (M--) { cin >> tA >> tB >> ship; if (ship == 1) Join(tA, tB); else Enemy[tA][tB] = Enemy[tB][tA] = true; } while (K--) { cin >> tA >> tB; if (Find(tA) == Find(tB) && Enemy[tA][tB] == false) { cout << "No problem" << '\n'; } else if (Find(tA) != Find(tB) && Enemy[tA][tB] == false) { cout << "OK" << '\n'; } else if (Enemy[tA][tB] == true && Find(tA) == Find(tB)) { cout << "OK but..." << '\n'; } else { cout << "No way" << '\n'; } } return 0; }