AcWing 858. Prim算法求最小生成树
原题链接
简单
作者:
minux
,
2020-04-28 00:05:09
,
所有人可见
,
阅读 533
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N=505;
int G[N][N];
bool vis[N];
int DIS[N];
int n, m;
int prim(){
int res=0;
for(int i=0; i<n; ++i){
int p=-1;
for(int j=1; j<=n; ++j){
if(!vis[j] && (p==-1 || DIS[p]>DIS[j])) p=j;
}
if(p>1 && DIS[p]==INF) return INF; // 如果该点和集合无法构成MST, 返回false
for(int j=1; j<=n; ++j)
if(j!=p)
DIS[j]=min(DIS[j], G[p][j]); // 更新除自环边外的权重
if(p>1) res+=DIS[p];
vis[p]=true;
}
return res;
}
int main(){
memset(G, 0x3f, sizeof G);
memset(DIS, 0x3f, sizeof DIS);
memset(vis, 0x00, sizeof vis);
int x,y,w;
cin>>n>>m;
while(m--){
cin>>x>>y>>w;
G[x][y]=G[y][x]=min(G[x][y], w); // 建立无向图
}
int res=prim();
if(res==INF) cout<<"impossible"<<endl;
else cout<<res<<endl;
return 0;
}