题目:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 510;
const int MAXN = 0x3f3f3f3f;
int g[N][N];//稠密图用邻接矩阵建图
int n,m;
int dist[N];//表示当前节点到集合的最短距离
bool st[N];//表示集合里的元素
int prim()
{
memset(dist,0x3f,sizeof dist);//初始化
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||dist[t] > dist[j]))t = j;
}//找到集合最近的点t,如果没有就是1
if(i&&dist[t] == MAXN)return MAXN;
if(i)res += dist[t];
for(int j = 1;j <= n;j++)
{
dist[j] = min(g[t][j],dist[j]);//从当前节点,更新他能到达的下一个节点的值
}
st[t] = true;//将当前节点加入集合
}
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 == 0x3f3f3f3f)cout<<"impossible"<<endl;
else cout<<t;
return 0;
}
//输入
//5 10
//1 2 3
//2 2 7
//2 1 1
//3 4 3
//4 4 -10
//1 3 -9
//5 2 -4
//3 1 0
//1 4 8
//4 4 7
//
//输出
//-9