#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=510,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
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;
if(i&&dist[t]==INF)return INF;
for(int j=1;j<=n;j++)
{if(t!=j)
dist[j]=min(dist[j],g[t][j]);}
if(i)res+=dist[t];
st[t]=true;
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof g);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=min(g[a][b],c);
}
int t=prim();
if(t==INF){
puts("imp");
}
else
printf("%d",t);
return 0;
}
改进了y总的算法,初始算法可能会存在自环,如果自环是负数的那个对于更新dist数组的话,最后的总数会变小,我们需要排除自环,当t==j的时候不更新,这样就可以排除自环。不然需要提前统计res,跟dijksstra思想差不多,不过更新的数据不需要相加,是到集合的最短距离,只需要看看其他点与新入st数组的点的距离有没有更短,有的话就更新,它不只是到起点的距离。
测试数据:
5 10
1 2 8
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
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4