prim算法
作者:
ysc
,
2021-08-07 08:31:48
,
所有人可见
,
阅读 240
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510, INF = 0x3f3f3f3f; //定义正无穷
int g[N][N]; //稠密图,邻接矩阵存储
int dist[N]; //每个点到集合的距离数组
bool st[N];
int n, m;
int prim()
{
memset(dist, 0x3f, sizeof dist); //初始化距离
int res = 0; //初始化最小生成树边长总和
for ( int i = 0; i < n; i ++ ) //进行n次迭代,因为要添加n条边
{
int t = -1; //寻找到集合距离最短的点
for ( int j = 1; j <= n; j ++ ) //寻找过程
if ( !st[j] && (t == -1 || dist[t] > dist[j]) )
t = j; //更新
if ( i && dist[t] == INF ) return INF; //二如果当前点不是第一个点,并且到集合的距离为正无穷,说明不连通
if ( i ) res += dist[t]; //如果不是第一个点,就加上边长
for ( int j = 1; j <= n; j ++ ) //用到集合距离最小的点更新其他点到集合的距离
dist[j] = min(dist[j], g[t][j]);
st[t] = true;
}
return res;
}
int main()
{
memset(g, 0x3f, sizeof g);
cin >> n >> m;
while ( m -- )
{
int a, b, w;
cin >> a >> b >> w;
g[a][b] = g[b][a] = min(g[a][b], w); //无向图,各加一次
}
int t = prim();
if ( t == INF ) puts("impossible");
else cout << t << endl;
return 0;
}