#include<iostream>#include<cstring>#include<algorithm>
using namespace std;#define inf 0x3f3f3f3f#define N 505
int n,m;
int mp[N][N];
int dis[N],vis[N];
int prim(){memset(dis,inf,sizeof dis);
int ans=0;memset(vis,0,sizeof vis);
dis[1]=0;for(int k=0;k<n;k++){
int mint=inf,v;for(int i=1;i<=n;i++){if((mint>dis[i])&&!vis[i]){
mint=dis[i];v=i;}}if(mint==inf)return inf;
vis[v]=1;
ans+=mint;for(int i=1;i<=n;i++)
dis[i]=min(dis[i],mp[v][i]);}return ans;}
int main(){
cin>>n>>m;memset(mp,inf,sizeof mp);for(int i=0;i<m;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
mp[a][b]=mp[b][a]=min(mp[a][b],c);}
int ans=prim();if(ans==inf)
cout<<"impossible"<<endl;else
cout<<ans<<endl;return0;}
2.kruskal算法(稀疏图适用—O(mlogm))
#include<iostream>#include<cstring>#include<algorithm>
using namespace std;
const int N=2e5+10;#define inf 0x3f3f3f3f
int pre[N];
int n,m;
struct edge
{
int u,v,w;}edges[N];
void init(){for(int i=1;i<=n;i++)
pre[i]=i;}
bool cmp(edge x,edge y){return x.w<y.w;}
int find(int x){if(x==pre[x])return x;return pre[x]=find(pre[x]);}
int kruskal(){
int ans=0,sum=0;sort(edges,edges+m,cmp);for(int i=0;i<m;i++){
int u=edges[i].u,v=edges[i].v,w=edges[i].w;
int fu=find(u),fv=find(v);if(fu!=fv){
pre[fu]=fv;ans+=w;
sum++;}}if(sum!=n-1)return-1;return ans;}
int main(){
cin>>n>>m;init();for(int i=0;i<m;i++){
int u,v,w;scanf("%d%d%d",&u,&v,&w);
edges[i]={u,v,w};}
int ans=kruskal();if(ans==-1)
cout<<"impossible"<<endl;else
cout<<ans<<endl;return0;}