L2-010 排座位 (25 分)
![在这里插入图片描述](https://img-blog.csdnimg.cn/08a9a8f226934f82b58ce64febed28bc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq5Yqq5Yqb5a2m5Lmg55qE6JCM5paw5Yqg5rK55ZOm,size_20,color_FFFFFF,t_70,g_se,x_16)
关键是朋友的朋友也是朋友,怎么表示?
可以建立一个并查集,把所有朋友关联起来。
#include<cstdio>
#include<vector>
using namespace std;
vector<int> people;
int enemy[111][111];
int find(int a)
{
while(a!=people[a])
{
a=people[a];
}
return a;
}
void Union(int a,int b)
{
int f1= find(a);
int f2=find(b);
if(f1!=f2)
{
people[f1]=f2;
}
}
int main()
{
int n,m,k,a,b,c,i;
scanf("%d %d %d",&n,&m,&k);
people.resize(n+1);
for(i=1;i<=n;i++){
people[i]=i;
}
for(i=0;i<m;i++)
{
scanf("%d %d %d",&a,&b,&c);
if(c==1)
{
Union(a,b);
}
else
{
enemy[a][b]=1;
enemy[b][a]=1;
}
}
for(i=0;i<k;i++)
{
scanf("%d %d",&a,&b);
if(find(a)==find(b)&&enemy[a][b]==0)
{
printf("No problem\n");
}
else if(find(a)!=find(b)&&enemy[a][b]==0){
printf("OK\n");
}
else if(find(a)==find(b)&&enemy[a][b]==1){
printf("OK but...\n");
}else if(enemy[a][b]==1){
printf("No way\n");
}
}
return 0;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/b60ba5e6e28d4b50b74de87313702529.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq5Yqq5Yqb5a2m5Lmg55qE6JCM5paw5Yqg5rK55ZOm,size_19,color_FFFFFF,t_70,g_se,x_16)