#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x7fffffff
#define maxn 100
using namespace std;
int n, m;
int edge[maxn][maxn];
int lowcost[maxn];
int nearvex[maxn];
void prim(int u0) {
int i, j;
int sumweight = 0;
for( i = 1; i <= n; i++ ) {
lowcost[i] = edge[u0][i];
nearvex[i] = u0;
}
nearvex[u0] = -1;
for( i = 1; i <= n; i++ ) {
int minx = INF;
int v = -1;
for( j = 1; j <= n; j++ ) {
if( nearvex[j] != -1 && lowcost[j] < minx ) {
v = j;
minx = lowcost[j];
}
}
if( v != -1) {
printf( "%d %d %d\n", nearvex[v], v, lowcost[v] );
nearvex[v] = -1;
sumweight += lowcost[v];
for( j = 1; j <= n; j++ ) {
if( nearvex[j] != -1 && edge[v][j] < lowcost[j] ) {
lowcost[j] = edge[v][j];
nearvex[j] = v;
}
}
}
}
printf("weight of MST if %d\n", sumweight);
}
void input() {
int i, j;
memset(edge, 0, sizeof(edge));
scanf("%d%d", &n, &m);
int u, v, w;
for( i = 1; i <= m; i++ ) {
scanf("%d%d%d", &u, &v, &w);
edge[u][v] = edge[v][u] = w;
}
for( i = 1; i <= n; i++ ) {
for( j = 1; j <= n; j++ ) {
if( i== j ) { edge[i][j] = 0 ; }
else if(edge[i][j] == 0 ) {
edge[i][j] = INF;
}
}
}
}
int main()
{
int start = 0;
input();
scanf("%d", &start);
prim(start);
return 0;
}
/************************
测试数据:
7 9
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24
3
***************************/
prim(最小生成树)
最新推荐文章于 2022-12-14 00:07:38 发布