算法与数据结构实验题 12.2 直通车 (并查集)

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\n");
		}
		else if(IsFriend==1&&IsEnemy==1)
		{
			printf("OK but...\n");
		}
		else if(IsFriend!=1&&IsEnemy==1)
		{
			printf("No way\n");
		}
		else if(IsFriend!=1&&IsEnemy!=1)
		{
			printf("No problem\n");
		}
	}
	return 0;
}
posted @ 2016-11-20 17:34  laixl  阅读(204)  评论(0编辑  收藏  举报