Think: 最小生成树的 题目, 所以 直接用 Prim算法 ; WA了22发 TAT 感觉萌萌哒~~~~
思路: Prim 模板 直接 套用就可以了
Problem Description 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。 Input 连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。 Output 输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。 Example Input
5 8 1 2 12 1 3 9 1 4 11 1 5 3 2 3 6 2 4 9 3 4 4 4 5 6
Example Output
19
#include<bits/stdc++.h> #define MAX 0x3f3f3f using namespace std; int Map[1050][1050]; int dis[1050]; int vis[1050]; bool flag; int Prim (int n); int main() { int n, m; int i, j; int a, b, c; while(cin >> n >> m) { memset(vis, 0, sizeof(vis)); memset(Map, 0, sizeof(Map)); memset(dis, 0, sizeof(dis)); flag = true; for (i = 1;i <= n;i ++) { for (j = 1;j <= n;j ++) { if (i == j) Map[i][j] = 0; else Map[i][j] = MAX; } } for (i = 1;i <= m;i ++) { cin >> a >> b >> c; if (Map[a][b] > c) { Map[a][b] = Map[b][a] = c; } } int ans = Prim(n); if (flag == false) cout << -1 << endl; else cout << ans << endl; } return 0; } int Prim (int n) { int i, j, t; int sum = 0; vis[0] = 1; for (i = 1;i <= n;i ++) { for (j = 1;j <= n;j ++) { dis[i] = Map[i][j]; } } for (i = 1;i <= n;i ++) { t = i; int MIN = MAX; for (j = 1;j <= n;j ++) { if (MIN > dis[j] && !vis[j]) { MIN = dis[j]; t = j; } } if (MIN == MAX) { flag = false; break; } sum = sum + MIN; vis[t] = 1; for (j = 1;j <= n;j ++) { if (Map[t][j] < dis[j]&&!vis[j]) { dis[j] = Map[t][j]; } } } return sum; }