基础知识
最短路
最小生成树
理解
代码
#include<bits/stdc++.h>
using namespace std;
//稠密图
const int N=510,M=10010,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
int d[N];
bool v[N];
int prim(){
memset(d,0x3f,sizeof d);
int res=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++)
if(!v[j]&&(t==-1||d[t]>d[j]))
t=j;
if(i&&d[t]==INF) return -1;//不能生成最小生成树
v[t]=true;
if(i) res+=d[t];
for(int j=1;j<=n;j++)
d[j]=min(d[j],g[t][j]);//更新点到集合的距离
}
return res;
}
int main(){
cin>>n>>m;
memset(g,0x3f,sizeof g);
while(m--){
int u,v,w;
cin>>u>>v>>w;
g[u][v]=g[v][u]=min(g[u][v],w);
}
int t=prim();
if(t==-1) cout<<"impossible"<<endl;
else cout<<t<<endl;
return 0;
}