• 算法与数据结构实验题 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
    ");
    		}
    		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;
    }
  • 相关阅读:
    4270. 【NOIP2015模拟10.27】魔道研究
    4269. 【NOIP2015模拟10.27】挑竹签
    NOIP2015模拟10.28B组
    JZOI5257. 小X的佛光
    4260. 最大子矩阵 (Standard IO)
    1010. 【CQOI2009】叶子的颜色
    【NOIP2015模拟10.22】最小代价
    JZOI 距离 (Standard IO) 题解
    统计和 luogu P2068 树状数组和线段树练手
    2020.7.15模拟赛
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/6083011.html
Copyright © 2020-2023  润新知