1075: 求最小生成树(Prim算法)

解法:

总结起来,Prim算法的核心思想是从一个顶点开始,一步一步地选择与当前最小生成树相邻的且权值最小的边,直到覆盖所有的顶点,形成一个最小生成树。

#include<iostream> 
#include<vector>
using namespace std;
typedef struct
{
	int n;
	int e;
	char data[500];
	int edge[500][500];
}Graph;
typedef struct
{
	int index;
	int cost;
}mincost;
typedef struct
{
	int x;
	int y;
	int weight;
}EDGE;
typedef struct
{
	int index;
	int flag;
}F;
void create(Graph& G, int n, int e)
{
	int i, j, k, w;
	char a, b;
	for (i = 0; i < n; i++)
		cin >> G.data[i];
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
		{
			if (i == j)
				G.edge[i][j] = 0;
			else
				G.edge[i][j] = 100;
		}
	for (k = 0; k < e; k++)
	{
		cin >> a;
		cin >> b;
		cin >> w;
		for (i = 0; i < n; i++)
			if (G.data[i] == a) break;
		for (j = 0; j < n; j++)
			if (G.data[j] == b) break;
		G.edge[i][j] = w;
		G.edge[j][i] = w;
	}
	G.n = n;
	G.e = e;
}
void Prim(Graph& G, int k)
{
	vector<mincost> closed(G.n);
	closed[k] = { -1,0 };
	for (int i = 0; i < G.n; i++) {
		if (i != k) {
			closed[i] = { k,G.edge[k][i] };
		}
	}
	for (int i = 1; i < G.n; i++) {
		mincost t = { 0,100 };
		for (int j = 0; j < G.n; j++) {
			if (closed[j].index!=-1&&closed[j].cost!=100)
				if (t.cost > closed[j].cost) {
					t.index = j;
					t.cost = closed[j].cost;
				}
		}
		char a = G.data[closed[t.index].index];
		char b = G.data[t.index];
		cout << '(' << a << ',' << b << ')';
		closed[t.index] = { -1,0 };
		for (int m = 0; m < G.n; m++) {
			if (closed[m].cost > G.edge[t.index][m])
				closed[m] = { t.index,G.edge[t.index][m] };
		}
	}
}
int main()
{
	Graph my;
	int n, e;
	cin >> n >> e;
	create(my, n, e);
	Prim(my, 0);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值