AcWing 858. Prim算法求最小生成树
原题链接
简单
作者:
StungYep
,
2019-08-05 15:20:25
,
所有人可见
,
阅读 804
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e3;
int n,m,cost[maxn][maxn],dis[maxn],v[maxn];
int prime()
{
int res=0,pos;
memset(dis,inf,sizeof(dis));
memset(v,0,sizeof(v));
for(int i=1;i<=n;++i) //随便选一点(这里选结点1)开始遍历
dis[i]=cost[1][i];
v[1]=1;
for(int i=1;i<n;++i)
{
pos=0;
for(int j=2;j<=n;++j){
if(!v[j] && dis[j]<dis[pos])
pos=j;
}
if(pos==0) return inf;
v[pos]=1;
res+=dis[pos];
for(int j=2;j<=n;++j) //更新dis数组
if(!v[j]) dis[j]=min(dis[j],cost[pos][j]);
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
memset(cost,inf,sizeof(cost));
for(int i=1;i<=m;++i){
int a,b,c;
cin>>a>>b>>c;
cost[a][b]=cost[b][a]=min(cost[a][b],c); //处理重边
}
prime()==inf?cout<<"impossible"<<endl:cout<<prime()<<endl;
}
return 0;
}