本来适合最小生成树几乎一模一样的,但写的时候碰到了点小插曲,导致调试了好久才发现错误。写篇文章以后让自己注意下类似问题。
因为和最小生成树很相像,就不再写注释了。
附上链接 : https://vjudge.net/contest/210090#problem/G
#include <algorithm>
#include <cstring>
#include <iostream>
#define MAX 2001
#define INF 0x3f3f3f
using namespace std;
int g[MAX][MAX], d[MAX], n, m;
int vst[MAX];
void prim(){
ios::sync_with_stdio(0);
fill(vst, vst+MAX, 0);
fill(d, d+MAX, -INF);
int ans=0;
d[1]=0;
for(int i=1; i<=n; i++){
int u=-1,MIN=-INF;
for(int j=1 ;j<=n; j++){
if(vst[j]==0 && d[j]>MIN){//一定是d[j]>MIN,而不是>= 。 不过如果数据设置不一样,要根据实际情况调整。
u=j;
MIN=d[j];
}
}
if(u == -1){cout<<"-1"<<endl; return ;}
ans+=d[u];
vst[u] = 1;
for(int v=1; v<=n; v++){
if(vst[v]==0 && g[u][v]>d[v]){
d[v] = g[u][v];
}
}
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(0);
int k1, k2, s;
while(cin >> n >> m){
fill(g[0], g[0]+MAX*MAX, -INF);
for(int i=0; i<m; i++){
cin >> k1 >> k2 >> s;
g[k1][k2]=s>g[k1][k2]?s:g[k1][k2];
g[k2][k1]=s>g[k2][k1]?s:g[k2][k1];
}
for(int i=1;i<=n;i++){
g[i][i]=0;
}
prim();
}
return 0;
}