prim算法----Kruskal一般不考

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 110;
const int MAX = 0x3f3f3f3f;
int mp[maxn][maxn];
int cost[maxn];
int n, m;
int prim(int n)
{
	int v[maxn];
	memset(v, 0, sizeof(v));
	v[1] = 1;
	int ans = 0;
	for (int i = 1; i <= n; i++) cost[i] = mp[1][i];
	for (int i = 2; i <= n; i++)
	{
		int minn = MAX;
		int f = -1;
		for (int j = 1; j <= n; j++)
		{
			if (v[j] == 0 && minn > cost[j])
			{
				minn = cost[j];
				f = j;
			}
		}
		if (f == -1) return -1;
		ans += minn;
		v[f] = 1;
		for (int j = 1; j <= n; j++)
		{
			if (v[j] == 0 && cost[j] > mp[f][j])
			{
				cost[j] = mp[f][j];
			}
		}
	}
	return ans;
}
int main()
{
	while (cin >> n >> m)
	{
		for (int i = 0; i <= n; i++)
		{
			for (int j = 0; j <= n; j++)
			{
				mp[i][j] = MAX;
			}
		}
		int a, b, c;
		for (int i = 0; i < m; i++)
		{
			scanf("%d%d%d", &a, &b, &c);
			if (mp[a][b] > c)
			{
				mp[a][b] = c;
				mp[b][a] = c;
			}
		}
		printf("%d\n", prim(n));
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42137874/article/details/110406258