类似dijkstra算法(贪心)
任意选择一个点,作为集合中的第一个点,找离集合最近的边,将边的点(未在集合中的)加入到集合中,如法炮制,直到结束。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 510, inf = 0x3f3f3f3f;
int g[N][N];
int n,m;
bool st[N];
int dis[N];
// int m;
int prim(){
memset(dis,0x3f,sizeof(dis));
int res = 0;
for(int i = 0; i < n; i++){
int t = -1;
for(int j = 1; j <= n; j++){
if(!st[j] && (t == -1 || dis[t] > dis[j]))
t = j;
}
if(i && dis[t] == inf) return inf;
if(i) res += dis[t];
st[t] = true;
for(int j = 1; j <= n; j++){
dis[j] = min(dis[j],g[t][j]);
}
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof(g));
for(int i = 0; i < m; i++){
int a,b,c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = min(g[a][b],c);
}
int t = prim();
if(t == inf) puts("impossible");
else printf("%d",t);
return 0;
}