解题思路:利用并查集合并可能能坐一桌的人,因为并查集可能会合并你的敌人进去,所以需要再用一个二维数组来辅助确认是否能坐在一起
#include<bits/stdc++.h>
using namespace std;
int f[101];
int find(int x){
while(x!=f[x])
x=f[x];
return x;
}
void uniont(int a,int b){
int fa=find(a);
int fb=find(b);
if(fa<fb)
f[fb]=fa;
else
f[fa]=fb;
}
int main(){
for(int i=0;i<101;i++)
f[i]=i;
int n,m,k,a,b,link;//a,b是需要判断的两个人,link是关系
cin>>n>>m>>k;
int relate[n+1][n+1];
memset(relate,0,sizeof(relate));
for(int j=1;j<=m;j++){
cin>>a>>b>>link;
relate[a][b]=link;//既然a和b是敌人或朋友甚至不是朋友,那么反过来也是
relate[b][a]=link;
if(link!=-1)
uniont(a,b);
}
for(int i=1;i<=k;i++){
cin>>a>>b;
if(relate[a][b]==1)//朋友
cout<<"No problem"<<endl;
else if(relate[a][b]==-1&&find(a)==find(b))//敌对且有共同朋友
cout<<"OK but..."<<endl;
else if(relate[a][b]==-1)//敌对
cout<<"No way"<<endl;
else//不是朋友也不是敌人
cout<<"OK"<<endl;
}
}