1. 程式人生 > >08-圖7 公路村村通

08-圖7 公路村村通

生成 判斷 註意 -h using otto ext 輸入數據 包括

題目:

現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若幹條道路的成本,求使每個村落都有公路連通所需要的最低成本。

輸入格式:

輸入數據包括城鎮數目正整數N1000)和候選道路數目M3N);隨後的M行對應MM條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從1到N編號。

輸出格式:

輸出村村通需要的最低成本。如果輸入數據不足以保證暢通,則輸出?1,表示需要建設更多公路。

輸入樣例:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

輸出樣例:

12

要點:
  最小生成樹的應用,註意判斷是否為連通圖
#include <iostream>
#include <algorithm>
using namespace std;
int w[5500];
int u[5500], v[5500];
int r[5500];
int p[1100];

int cmp(const int a, const int b)
{
    return w[a] < w[b];
}

int Find(int x)
{
    return p[x] == x ? x : p[x] = Find(p[x]);
}

int Kuskal(int
n, int m) { int ans = 0; int cnt = 0; for (int i = 1; i <= n; i++) p[i] = i; for (int i = 1; i <= m; i++) r[i] = i; sort(r+1, r+m+1, cmp); for (int i = 1; i <= m; i++) { int e = r[i]; int x = Find(u[e]); int y = Find(v[e]);
if (x != y) { ans += w[e]; cnt++; p[x] = y; } } if (cnt < n-1) return -1; else return ans; } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) cin >> u[i] >> v[i] >> w[i]; int ans = Kuskal(n, m); if (ans == 0 || ans == -1) cout << "-1"; else cout << ans; return 0; }

 

08-圖7 公路村村通