对比了 n 个正解就是找不出问题在哪 /kk
#include<bits/stdc++.h>
using namespace std;
int n,m,g[5003][5003],d[5003];
bool vis[5003];
int prim(){
d[1]=0;
int ans=0;
for(int i=1;i<=n;++i){
int mi=0x3f3f3f3f,u=-1;
for(int j=1;j<=n;++j)
if(!vis[j]&&d[j]<mi)
u=j,mi=d[j]; //更新选择连接的边
if(u==-1) return -1;
vis[u]=true;
ans+=d[u];
for(int v=1;v<=n;++v)
if(!vis[v]&&g[u][v]<d[v])
d[v]=g[u][v]; //更新到各点的最小权值
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
memset(d,0x3f,sizeof(d));
memset(g,0x3f,sizeof(g));
int u=0,v=0,w=0;
for(int i=1;i<=m;++i){
scanf("%d%d%d",&u,&v,&w);
g[u][v]=g[v][u]=w;
}
int ans=prim();
if(ans==-1) printf("orz\n");
else printf("%d\n",ans);
return 0;
}