思想: 运用并查集与一个二维数组。
// 朋友的朋友就是我的朋友,敌人的朋友不一定是我的敌人 这两个点是可以用并查集的。
因为在找两个人的关系时,在一个集合类的肯定是朋友,否则就是没关系或敌人, 是否为敌人只需看二维数组是否为-1, -1表示敌人, 0 表示没关系。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
using namespace std;
int pre[101];
int g[101][101];
int n,k,m;
int getroot(int t) // 找到树根,并缩短路径
{
if(pre[t] == t) return t;
return pre[t] = getroot(pre[t]);
}
int join(int t1,int t2) // 将两个不同的集合放在一起
{
int a = getroot(t1);
int b = getroot(t2);
if(a != b)
pre[a] = b;
}
int main()
{
memset(g,0,sizeof(g)); //初始化为任意两人之间都是没关系的。
cin >> n >> k >> m;
for(int i = 0; i <= n; i++) //初始化根都为自己
pre[i] = i;
for(int i = 0; i < k; i++)
{
int t1,t2,connect;
cin >> t1 >> t2 >> connect;
g[t1][t2] = connect; //重新定义二者之间的关系
g[t2][t1] = connect; //重新定义二者之间的关系
if(connect != -1) // 关系不为 -1, 则为1, 那么就加到一个朋友圈中
join(t1,t2);
}
for(int i = 0; i < m; i++)
{
int t1,t2;
cin >> t1 >> t2;
if(g[t1][t2] == -1)
{
if(getroot(t1) == getroot(t2))
cout << "OK but..." << endl;
else
cout << "No way" << endl;
}
else if(getroot(t1) == getroot(t2))
cout << "No problem\n";
if(g[t1][t2] == 0)
cout << "OK" << endl;;
}
}