思路:我们可以发现,敌对关系并不影响朋友关系,所以我们可以把这两种关系分开去维护。因为朋友的朋友是朋友,所以用并查集维护朋友关系。因为只有直接敌对的两个人才真的敌对,所以二维数组维护敌对关系。然后按要求输出即可。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int N, M, K, f[MAXN];//朋友关系
bool vis[MAXN][MAXN];//敌对关系
void init()
{
for (int i = 0; i <= N; i++) f[i] = i;
memset(vis, 0, sizeof(vis));
}
int Find(int x)
{
if (f[x] == x) return x;
f[x] = Find(f[x]);
return f[x];
}
void Union(int x, int y)
{
int root1 = Find(x), root2 = Find(y);
if (root1 != root2)
{
f[root1] = root2;
}
}
int main()
{
scanf("%d%d%d", &N, &M, &K);
init();
while (M--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (c == 1) Union(a, b);
if (c == -1) vis[a][b] = vis[b][a] = true;
}
while (K--)
{
int a, b;
scanf("%d%d", &a, &b);
int root1 = Find(a), root2 = Find(b);
if (root1 == root2 && vis[a][b] == false)
printf ("No problem\n");
else if (root1 != root2 && vis[a][b] == false)
printf ("OK\n");
else if(root1 == root2 && vis[a][b] == true)
printf("OK but...\n");
else if(root1 != root2 && vis[a][b] == true)
printf("No way\n");
}
return 0;
}
/*
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
*/