#include<cstdio>
#include<map>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, graph[66][66], vis[66], dis[66];//dis表示当前顶点i离生成树最近距离
int sum = 0;
void prim()
{
memset(vis, 0, sizeof(vis));
memset(dis, 0, sizeof(vis));
int i, j;
for (i = 1; i <= n; i++)//初始化
{
if (i != 1)
{
dis[i] = graph[1][i];//初始化dis
}
}
vis[1] = 1;//加入生成树
for (i = 1; i < n; i++)//找到n-1个点就好了
{
int Min = inf;
int id = 0;
for (j = 1; j <= n; j++)//找离生成树最近的顶点
{
if (vis[j] == 0 && Min > dis[j])
{
Min = dis[j];
id = j;
}
}
sum += dis[j];
vis[id] = 1;
for (j = 1; j <= n; j++)//更新最短距离
{
if (vis[j] == 0 && dis[j] > graph[id][j])
{
dis[j] = graph[id][j];
}
}
}
printf("%d", sum);
}
int main()
{
cin >> n >> m;
int i, j;
for (i = 1 ;i <= n; i++)//初始化
{
for (j = 1; j <= n; j++)
{
graph[i][j] = inf;
}
}
for (i = 1; i <= m; i++)//输入
{
int a, b, c;
cin >> a >> b >> c;
graph[a][b] = c;
graph[b][a] = c;
}
prim();
return 0;
}
最小生成树-prim算法
最新推荐文章于 2024-03-01 11:05:40 发布