用一个vector来存敌人
用并查集来看是不是有共同朋友
思路较为简单
#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX_N = 105;
//存敌人
int p[MAX_N];
int find(int x)
{
return x == p[x] ? x : p[x] = find(p[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
return;
p[x] = y;
}
int main()
{
int N, M, K;
cin >> N >> M >> K;
//默认父亲
iota(p, p + N, 0);
vector<int> dp[MAX_N];
for (int i = 0; i < M; i++)
{
int a, b, c;
cin >> a >> b >> c;
if (c == 1)
{
unite(a, b);
}
else
//邻接点存图法
{
dp[a].push_back(b);
dp[b].push_back(a);
}
}
while (K--)
{
int a, b;
cin >> a >> b;
//f做是不是敌人的标记
int f = 0;
//找是不是敌对的人
for (auto e : dp[a])
if (e == b)
f = 1;
//只是朋友关系
if (find(a) == find(b) && f != 1)
cout << "No problem\n";
//只有敌对
else if (find(a) != find(b) && f == 1)
cout << "No way\n";
//朋友加敌对
else if (find(a) == find(b) && f == 1)
cout << "OK but...\n";
//啥也不是
else
cout << "OK\n";
}
return 0;
}