POJ2421题解(最小生成树)

题目翻译:

  • Description:
    有N个村庄,编号从1到N,您应该修建一些道路,以便每两个村庄可以相互连接。 我们说两个村庄A和B是连通的,当且仅当A和B之间有一条道路,或者存在一个村庄C使得A和C之间有一条道路,并且C和B连通时。
    我们知道,一些村庄之间已经存在一些道路,您的工作是建造一些道路,以使所有村庄都连接起来,并且所有道路的长度都应最小。
  • Iuput:
    第一行是整数N(3 <= N <= 100),它是村庄的数量。 然后是N行,其中第i个包含N个整数,而这N个整数中的第j个是村庄i与村庄j之间的距离(该距离应为[1,1000]之内的整数)。
    然后有一个整数Q(0 <= Q <= N *(N +1)/ 2)。 然后出现Q条线,每条线包含两个整数a和b(1 <= a <b <= N),这意味着已经建立了村庄a和村庄b之间的道路。
  • Output:
    您应该输出一条包含整数的线,该整数是要连接所有村庄的所有道路的长度,并且该值是最小值。

题目分析:

这个题其实就是最小生成树的题目,让你把N个点联通所需要的最小代价对吧,只不过特别的是已经给你联通好了一部分,那就将距离设成0即可。附上代码:
在这里插入图片描述

#include<iostream>
using namespace std;
int map[101][101] = {
    
     0 };
int flag[101] = {
    
     0 };
int main()
{
    
    
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    	
		for (int j = 0; j < n; j++)
			cin >> map[i + 1][j + 1];
	}
	int m;
	cin >> m;
	for (int i = 0; i < m; i++)
	{
    
    
		int a, b;
		cin >> a >> b;
		map[a][b] = 0;
		map[b][a] = 0;
	}
	int cnt = 1; int ans = 0;
	while (cnt == 1)
	{
    
    	
		int min = 1e8; int sub = 101; cnt = 0;
		for (int i = 2; i <= n; i++)
		{
    
    	
			if (flag[i]==0&&map[1][i] < min)
			{
    
    
				min = map[1][i];
				sub = i;
				cnt = 1;
			}
		}
		ans += min;
		map[1][sub] = 0;
		flag[sub] = 1;
		for (int i = 2; i <= n; i++)
		{
    
    
			if (map[sub][i] < map[1][i])
			{
    
    
				map[1][i] = map[sub][i];
			}
		}
	}
	cout << ans-1e8;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/stn54999/article/details/113791339