1、题目:
2、解题思路
使用并查集,对于两个数,查找他们是否属于同一个集合,属于同一个集合就说明他们是朋友。对于敌人则开一个数组来特别记录是敌对关系的两个乘客。
3、代码:
#include<stdio.h>
int pre[101];
int enemy[101][101];
int find(int x)//查找所在集合,并做路径压缩,方便下次查找
{
int r=x;
while(pre[r]!=r)
{
r=pre[r];
}
int i=x,j;
while(pre[i]!=r)//路径压缩
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y)//合并
{
int fa=find(x);
int fb=find(y);
if(fa!=fb)
{
pre[fa]=fb;
}
}
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int i;
for(i=1; i<=n; i++)
{
pre[i]=i;
}
int u,v,w;
for(i=0; i<m; i++)
{
scanf("%d%d%d",&u,&v,&w);
if(w==1)
{
join(u,v);
}
else//w=-1时表示为敌人,数组记录一下两者的关系
{
enemy[u][v]=-1;
enemy[v][u]=-1;
}
}
int a,b;
for(i=1; i<=k; i++)
{
scanf("%d%d",&a,&b);
int IsFriend=0,IsEnemy=0;
int fa=find(a);
int fb=find(b);
if(fa==fb)//判断是否属于同一个集合,即可判断是否为朋友
{
IsFriend=1;
}
if(enemy[a][b]==-1||enemy[b][a]==-1)//判断是否为敌人
{
IsEnemy=1;
}
if(IsFriend==1&&IsEnemy!=1)
{
printf("Good job
");
}
else if(IsFriend==1&&IsEnemy==1)
{
printf("OK but...
");
}
else if(IsFriend!=1&&IsEnemy==1)
{
printf("No way
");
}
else if(IsFriend!=1&&IsEnemy!=1)
{
printf("No problem
");
}
}
return 0;
}