【2017】图的最小生成树(模板题)

27 篇文章 2 订阅
1 篇文章 0 订阅

题目:
一个无向图,顶点为N个,其中M条边已给定,求使得整个图连通,且选出的边权值和最小。
输入
4 4
1 2 2
1 4 1
2 3 3
3 4 4

输出

6
第一行的两个数据分别为N顶点个数和边M的个数;下面的M行为每条边的数据,
起始点和终点,还有每条边的权值。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10010,INF=99999999;
int G[maxn][maxn];
int d[maxn];
bool visit[maxn] = { false };
int n,sum = 0;
int prim(int index) {
	fill(d, d + maxn, INF);
	d[index] = 0;
	for (int i = 1; i <= n; i++) {
		int u = -1, mind = INF;
		for (int j = 1; j <= n; j++) {
			if (visit[j] == false && d[j] < mind) {  //从未被访问的点中找到距离值最小的
				u = j;
				mind = d[j];
			}
		}
		if (u == -1) return -1;
		visit[u] = true;
		sum += d[u];
		for (int v = 1; v <= n; v++) {
			if (visit[v] == false && G[u][v]!=INF && G[u][v] < d[v])    //G[u][v]!=INF不要丢
				d[v] = G[u][v];
		}
	}
	return sum;
}
int main() {
	int m,a,b,x;
	cin >> n >> m;
	fill(G[0], G[0] + maxn*maxn, INF);    //二维数组使用fill赋初值
	for (int i = 0; i < m; i++) {
		cin >> a >> b >> x;
		G[a][b] = G[b][a] = x;    //无向图记得双向赋值!
	}
	cout << prim(1);
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值