#include <bits/stdc++.h>
using namespace std;
#define cf 999999999
int a[102][102], visit[102], b[102];
void Prim(int n)
{
int i;
int sum = 0;
int m = n-1;//n个节点的图只需要寻找n-1条边;
visit[1] = 1;
while(m--)
{
int Min = cf, t;
for(i = 1; i<= n; i++)//选择离最小生成树最近的节点
{
if(b[i] < Min && visit[i] == 0)
{
Min = b[i];
t = i;
}
}
sum += Min;//将其加入到最小生成树的集合里
visit[t] = 1;
for(i = 1; i<=n; i++)//更新最小生成树领边的权值
{
if(b[i]>a[t][i] && visit[i] == 0)
b[i] = a[t][i];
}
}
printf("%d\n", sum);
}
int main()
{
int i, j, x, y, z, m, n;
while(~scanf("%d%d",&m, &n))
{
memset(visit,0,sizeof(visit));
memset(b, cf, sizeof(b));
for(i = 1; i<=m; i++)
{
for(j = 1; j<=m; j++)
{
if(i == j) a[i][j] = 0;
else a[i][j] = cf;
}
}
for(i = 0; i< n; i++)
{
cin>>x>>y>>z;
a[x][y] = a[y][x] = min(a[x][y],z);
}
for(i= 1; i<=m; i++)
{
b[i] = a[1][i];
}
Prim(m);
}
return 0;
}
数据结构实验之图论九:最小生成树
最新推荐文章于 2020-10-28 20:46:08 发布