题目:排座位
思路:
(1)标记:用一个二维数组,分别将输入的那些人的关系标记,
(2)利用并查集将朋友的人合并分类;
(3)查找:输入a,b 首先看标记数组
visit[a][b] = 1 时 朋友关系
visit[a][b] = 0 时 既不朋友又五敌对
visit[a][b] = -1 时 再分俩种情况:各自进行find查找他们是否有相同的根,有说明有共同的朋友,否则即为纯敌对!
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 105;
int f[maxn],visit[maxn][maxn],n;
void init(){//初始化
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++) f[i] = i;
}
int findd(int v){//找根
if(v != f[v]) f[v] = findd(f[v]);
return f[v];
}
void mergee(int x,int y){//合并
int tx = findd(x);
int ty = findd(y);
if(tx != ty) f[ty] = tx;
}
int main()
{
int m,k,u,v,con;
while(~scanf("%d%d%d",&n,&m,&k)){
init();
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&con);
visit[u][v] = visit[v][u] = con;//将关系标记
if(con == 1) mergee(u,v);//将朋友的合并
}
for(int i=0;i<k;i++){
scanf("%d%d",&u,&v);
if(visit[u][v] == 1) printf("No problem\n");//本身就是朋友
if(visit[u][v] == 0) printf("OK\n");//俩不关系
if(visit[u][v] == -1){//敌对
if(findd(u) == findd(v)) printf("OK but...\n");//有共同朋友
else printf("No way\n");//纯敌对
}
}
}
return 0;
}