• 洛谷试题——村村通


    村村通(并查集)

    链接https://www.luogu.com.cn/problem/P1536

    根据题意可知有若干组数据,我们需要对每组数据使用并查集,然后判断最少需要建设多少条路才能使各个城镇之间互通。

    下面放蒟蒻的代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<queue>
    #include<stack>
    #include<algorithm>
    #define MAXN 0x3f3f3f3f;
    using namespace std;
    	int CC[10001];
    	int n, m;
    	int x, y;
    
    	void make_set()//并查集初始化
    	{
    		for (int i = 1; i <= n; i++)
    			CC[i] = i;
    	}
    	int findx(int x)//并查集查找
    	{
    		if (CC[x] != x)
    		{
    			CC[x] = findx(CC[x]);
    		}
    		return CC[x];
    	}
    	void unity(int t1, int t2)//合并
    	{
    		int x1 = findx(t1);
    		int	y1 = findx(t2);
    		if(x1!=y1)
    		CC[x1] = y1;
    
    	}
    	int main()
    	{
    		while (true)
    		{
    			int ans = 0;
    			cin >> n;
    			if (n == 0)//结束标志
    			{
    				return 0;
    			}
    			cin >> m;
    			make_set();//每一组数据结束 对并查集初始化
    			for (int i = 1; i <= m; i++)
    			{
    
    				cin >> x >> y;
    				unity(x, y);//合并
    			}
    			for (int i = 1; i <= n; i++)
    			{
    				if (i == findx(i))
    					ans++;
    			}
    			printf("%d\n", ans - 1);
    
    		}
    		return 0;
    	}
    

    下面分析一下这个代码

    for (int i = 1; i <= n; i++)
    			{
    				if (i == findx(i))
    					ans++;
    			}
    

    拿这个数据分析吧!!!!

    4 2
    1 3
    4 3
    

    已知有四个城镇,其中1-3是相通的,4-3也是相通的,因此CC[1]=3,CC[4]=3,CC[3]=3,,CC[2]=2;

    可以知道1,3,4是相连的,其中1和4的并查集都不等于自己本身,都等于3,而另外两个城镇都等于自己本身,因此1和4必定与另外两个中的一个相连,所有得出有3个城镇相连,因此,我们只需要统计并查集为本身的城镇,然后减去1,就是我们需要修的路。

  • 相关阅读:
    oracle锁---原理篇
    SML + NL + HJ
    Oracle中varchar,varchar2,nvarchar,nvarchar2的区别
    oracle 一致读原理
    commit 流程
    IMPDP NETWORK_LINK参数
    WINDOWS访问虚拟机RedHat搭配的Apache2服务器
    初识malloc函数
    好吧,又失眠
    休息一天
  • 原文地址:https://www.cnblogs.com/a821403286/p/13620382.html
Copyright © 2020-2023  润新知