核心思想:Prim 算法 类似于dijkstra算法 更新距离时改为到**集合(生成树)**的距离
最小生成树长这样 每次迭代放一个最近(有边)点,一条最短边进生成树
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 510, INF = 0x3f3f3f3f;
int g[N][N]; //稠密图
int d[N]; //记录到集合距离
int n,m,res; //res记录集合内总权值
bool st[N];
int Prim(){
memset(d,0x3f,sizeof d);
d[1] = 0;
for(int i=0;i<n;i++)
{
int t = -1; //找最近的点
for(int j = 1;j<=n;j++) //找最近的点
{
if(!st[j] && (t==-1 || d[t] > d[j])) //找最近的点
{
t = j;
}
}
if(d[t] == INF) return INF; //最短的距离是INF 说明没有联通的点
res += d[t]; //t加入集合 总权值加上t的
st[t] = true;
for(int j=1;j<=n;j++) d[j] = min(d[j] , g[t][j]); //用t更新其他店距集合的距离
}
return res;
}
int main(){
cin>>n>>m;
memset(g, 0x3f, sizeof g);
while(m--)
{
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 cout<<t;
}