这里我没看出来是并查集
因为我觉得“朋友的朋友就是朋友” 那“朋友的朋友的朋友的朋友的朋友”是不是就是朋友呢 我感觉不是 禁止套娃
好吧那也是算的,如果只算一层关系测试点1过不去扣三分
#include<bits/stdc++.h>
using namespace std;
int friends[110];
int getFriend(int x){
while(x!=friends[x]) x=friends[x];
return x;
}
void Union(int a,int b){
int fa=getFriend(a);int fb=getFriend(b);
if(fa!=fb) friends[fa]=fb;
}
int g[110][110];//只单纯用于判断敌对关系
int main(){
fill(g[0],g[0]+110*110,0);
for(int i=0;i<110;i++) friends[i]=i;
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<m;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
g[x][y]=z;g[y][x]=z;
if(z==1) Union(x,y);
}
for(int i=1;i<=n;i++) friends[i]=getFriend(i);
// 如果两位宾客之间是朋友,且没有敌对关系,则输出No problem;
// 如果他们之间并不是朋友,但也不敌对,则输出OK;如果他们之间有敌对,然而也有共同的朋友,则输出OK but...;如果他们之间只有敌对关系,则输出No way
for(int i=0;i<k;i++){
int x,y;
scanf("%d %d",&x,&y);
if(g[x][y]!=-1&&friends[x]==friends[y]) printf("No problem\n");
else if(friends[x]!=friends[y]&&g[x][y]!=-1) printf("OK\n");
else if(friends[x]==friends[y]&&g[x][y]==-1) printf("OK but...\n");
else printf("No way\n");
}
return 0;
}