#include<stdio.h>
const int INF=100000000;
const int MAXV=110;
int g[110][110];
int d[110];
int vis[110];
int n,m;//路数,村庄数
int Prim(){
for(int i=0;i<110;i++){
d[i]=INF;
vis[i]=0;
}
d[1]=0;
int ans=0;//存放最小生成树的边权之和
for(int i=1;i<m+1;i++){
int u=-1,MIN=INF;
for(int j=1;j<m+1;j++){
if(d[j]<MIN&&vis[j]==0){
u=j;
MIN=d[j];
}
}
if(u==-1)return-1;
vis[u]=1;
ans+=d[u];
for(int v=1;v<m+1;v++){
if(vis[v]==0&&g[u][v]!=INF&&g[u][v]<d[v]){
d[v]=g[u][v];
}
}
}
return ans;
}
int main(){
while(1){
for(int i=0;i<MAXV;i++){
for(int j=0;j<MAXV;j++){
g[i][j]=INF;
}
}
scanf("%d%d",&n,&m);
if(n==0)break;
int a,b,c;
for(int i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
g[a][b]=c;
g[b][a]=c;
}
int ans=Prim();
if(ans==-1){
printf("?\n");
}else{
printf("%d\n",ans);
}
}
}
算法笔记---10.5---C
猜你喜欢
转载自blog.csdn.net/weixin_46265246/article/details/105257475
今日推荐
周排行