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;
    }
  • 相关阅读:
    Windows Internals学习笔记(八)IO系统
    FPGA相关术语(一)
    Bilinear Filter
    总线与接口
    GPIO相关知识
    .NET IL学习笔记(一)
    Windows Internals学习笔记(七)Image Loader
    Windows Internals学习笔记(五)Synchronization
    struts2官方 中文教程 系列五:处理表单
    struts2官方 中文教程 系列四:Action
  • 原文地址:https://www.cnblogs.com/laixiaolian/p/6083011.html
Copyright © 2011-2022 走看看