Notas de algoritmo --- 10.5 --- C

#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);
        }   
    }
} 
30 artículos originales publicados · Me gusta1 · Visitas 394

Supongo que te gusta

Origin blog.csdn.net/weixin_46265246/article/details/105257475
Recomendado
Clasificación