zoukankan      html  css  js  c++  java
  • 算法与数据结构实验题 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;
    }
  • 相关阅读:
    Servlet Filter过滤器执行顺序
    eclipse乱码问题
    如何查看servlet&jsp版本?
    Unity的shader学习2
    Unity的shader学习1
    后缀数组专题与代码模板
    哈希表/散列表 指针版模版
    图的连通性专题及模板
    一般图最大匹配--带花树
    7-15至7-17训练赛回顾
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/6083011.html
Copyright © 2011-2022 走看看