用两个vector 分别存放各自的朋友 敌人
用并查集来看是不是有共同朋友
思路较为简单
注释比较详细
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
const int MAX_N = 110;
//朋友关系图
int visited[MAX_N];
//敌人
vector<int> enemy[MAX_N];
//朋友
vector<int> frinde[MAX_N];
int find(int x)
{
return visited[x] == x ? x : visited[x] = find(visited[x]);
}
int main()
{
int N, M, K;
scanf("%d%d%d", &N, &M, &K);
//初始化
iota(visited, visited + N, 0);
for (int i = 0; i < M; ++i)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if (z == 1)
{
frinde[x].push_back(y);
frinde[y].push_back(x);
int a = find(x);
int b = find(y);
if (a != b)
visited[a] = b;
}
else
{
enemy[x].push_back(y);
enemy[y].push_back(x);
}
}
while (K--)
{
int a, b;
scanf("%d%d", &a, &b);
int t = 1;
int a_1 = find(a);
int a_2 = find(b);
//看是不是朋友
for (auto e : frinde[a])
{
if (e == b)
{
printf("No problem\n");
t = 0;
break;
}
}
if (t)
{
//看是不是敌人
for (auto e : enemy[a])
{
if (e == b)
{
//看有没有共同的朋友
if (a_1 == a_2)
printf("OK but...\n");
else
printf("No way\n");
t = 0;
break;
}
}
}
if (t)
printf("OK\n");
}
return 0;
}