数据结构课设 公路村村通 (最小生成树prim算法)

5-16 公路村村通   (30分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数NN\le 10001000)和候选道路数目MM\le 3N3N);随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NN编号。

输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出-11,表示需要建设更多公路。

输入样例:

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

和dijkstra就只有判断是否松弛的地方不一样,最后还要判断是否访问了所有的点,否则不联通


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack> 
#include <cstring>
using namespace std;
const int inf  = 0x3f3f3f3f;
int map[1100][1100];
int dis[1100];
int vis[1100];
int N, M;
int main() {
		scanf("%d %d", &N, &M);
		int i, j;
		for(i = 1; i <= N; i++) {
			for(j = 1; j <= N; j++) {
				if(i != j) map[i][j] = inf;
				else map[i][j] = 0;
			}
		}
		int x, y, z;
		for(i = 1; i <= M; i++) {
			scanf("%d %d %d", &x, &y, &z);
			map[x][y] = z;
			map[y][x] = z;
		}
		for(i = 1; i <= N; i++) {
			dis[i] = map[1][i];
		}
		vis[1] = 1;
		int min, ans = 0, u;
		for(i = 2; i <= N; i++) {
			min = inf;
			for(j = 1; j <= N; j++) {
				if(vis[j] == 0 && min > dis[j]) {
					min = dis[j];
					u = j;
				}
			}
			vis[u] = 1;
			ans += min;
			for(j = 1; j <= N; j++) {
				if(vis[j] == 0 && dis[j] > map[u][j]) {
					dis[j] = map[u][j];
				}
			}
		}
		int flag = 0;
		for(i = 1; i <= N; i++) {
			if(vis[i] == 0) {
				flag = 1;
				break;
			}
		}
		if(flag) printf("-1\n");
		else printf("%d\n", ans);
	return 0;
}


你可能感兴趣的:(数据结构课设 公路村村通 (最小生成树prim算法))