• P1536 村村通(洛谷)并查集


    隔壁的dgdger带我看了看老师的LCA教程,我因为学习数学太累了(就是懒),去水了一下,感觉很简单的样子,于是我也来写(水)个博客吧。

    题目描述
    某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?
    输入格式
    输入包含若干组测试测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目n和道路数目m
    随后的m行对应m条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从 
    1到n编号。
    注意:两个城市间可以有多条道路相通。
    输出格式
    对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。
    

    看这个题板像极了并查集(就是)我们加上一点点优化就可以变成LCA(最近公共祖先)。

    首先我们先说说并查集怎么做:并查集就是把相连接的点放到一个集合里,就像战争一样,一个士兵遇见了另一个,2人如果不是同一个主公的士兵,就会打起来(不会有士兵自相残杀吧),那怎么判断他们两个是不是同一个主公的士兵呢?当然是飞鸽传书给自己的将军,将军要给将军的将军飞鸽传书……等传到2人主公那里,主公再告诉他们,得知2人的主公是同一人后,2人就会和谐离去,不是同一人,2人就会打起来,输了的那个会劝说自己的主公和对方主公合作(因为训练机制一样,一个打不过一队肯定也打不过,不过这真是太和谐了)。蛋是,士兵们不傻……战场上这么多人,每次都要向上级不断的问也太费劲了,于是士兵们相处了一个好办法,已经知道自己的主公是谁时,只要去问问主公,自己有没有投靠别的主公,如果有,就继续问。而且中途的将军和主公们也记下自己最大的主公是谁,这样以后查找就会轻松很多啦。(其实这就是很简单的LCA)

    现在这个题相当于给出了每个士兵的战况,但现在主公们想要和谐相处,问他们还要让士兵打几架?

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long n,m,a,b,shu;
    long long f[1005];
    int zbb(int wz)
    {
    	if(f[wz]==wz)//如果现在这位是最大的主公,就可以退出了 
    	{
    		return wz;
    	}
    	f[wz]=zbb(f[wz]);//中间迷茫的将军们找到了自己为谁而厮杀 
    	return f[wz];//让将军告诉我 
    }
    int main()
    {
    	while(true)
    	{
    		scanf("%lld",&n);//给出势力的数量 
    		if(n==0)
    		{
    			return 0;
    		}
    		shu=0;//势力的初始化 
    		for(int i=1;i<=n;i++)
    		{
    			f[i]=i;
    		}
    		scanf("%lld",&m);//给出打了多少架
    		for(int i=0;i<m;i++)
    		{
    			cin>>a>>b;//给出双方 
    			f[zbb(a)]=zbb(b);//假设b赢了,a的势力投靠b 
    		}
    		for(int i=1;i<=n;i++)
    		{
    			if(f[i]==i)//这个势力没投靠过任何人,是一个单独的势力 
    			{
    				shu++; 
    			}
    		}
    		cout<<shu-1<<endl;//一共有shu个单独势力,要求剩下一个,所以要打shu-1架	
    	}
    	return 0;
    }
    

    哎呀我真是机智,士兵们都会感谢我的。

  • 相关阅读:
    录音 静音检测
    Busybox是什么?
    ubuntu 和VMWare共享数据时故障解决
    使用IStream和GDI+在内存中实现图像格式转换
    .Net 玩自动化测试
    【C#|.NET】跳出一致性Hash算法 打造更高效的分布式缓存
    【C#|.NET】从细节出发(一) 通用接口 aop dto 相关
    【linux+C】神器 vim + 指针相关客串
    【C#|.NET】分布式锁服务
    读书笔记: CLR篇 (让你了解C#.Net的实质) (20111219更新)
  • 原文地址:https://www.cnblogs.com/lichangjian/p/13206632.html
Copyright © 2020-2023  润新知