POJ2421題解(最小生成樹)
阿新 • • 發佈:2021-02-12
技術標籤: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;
}