zoukankan      html  css  js  c++  java
  • B

    - 题目大意

        某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 

    - 解题思路

        运用并查集的知识可以很容易做出。初始化时每个城镇都没有路,所以要连接的路的数量为n-1个,之后在增加路的过程中,先用并查集搜索,如果两个城镇确实不在一个集合,这条路就有用,两个城镇归为一个集合中,要连接的路减一。如果两个城镇之前就已经在一个集合里,增加的这条路就无用,要连接的路不变

    - 代码

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int MAX = 1e5 + 50;
    int fa[MAX];
    void init(int n)
    {
    	for (int i = 0; i <= n; i++)
    		fa[i] = i;
    }
    
    int find(int x)
    {
    	if (x == fa[x])
    		return x;
    	else
    	{
    		return fa[x] = find(fa[x]);
    	}
    }
    
    int main()
    {
    	int n,m,x, y;
    	scanf("%d", &n);
    	while (n != 0)
    	{
    		scanf("%d", &m);
    		init(n);
    		int sum = n-1;
    		for (int i = 0; i < m; i++)
    		{
    			cin >> x >> y;
    			int fx = find(x), fy = find(y);
    			if (fx == fy)
    				continue;
    			else
    			{
    				fa[fx] = fy;
    				sum--;
    			}
    		}
    		printf("%d
    ", sum);
    		scanf("%d", &n);
    
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    桶排序
    Ultra-QuickSort
    Merge Sort
    Max Sum
    快排
    Oil Deposits
    1009: josephus问题
    A+B Again(在某个数中找大于m的最小约数)
    luogu4181 [USACO18JAN]Rental Service (贪心)
    luogu4185 [USACO18JAN]MooTube (并查集)
  • 原文地址:https://www.cnblogs.com/alpacadh/p/8449430.html
Copyright © 2011-2022 走看看