1. 程式人生 > 其它 >POJ2421題解(最小生成樹)

POJ2421題解(最小生成樹)

技術標籤:POJ

題目翻譯:

  • 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; }