【模板】最小生成樹prim算法

#include<iostream>
using namespace std;
#define MAX 105
#define MAXCOST 1<<30

int map[MAX][MAX];
int lowcost[MAX],mst[MAX];

void prim(int n)
{
    for(int i=1;i<=n;i++)
        lowcost[i]=map[1][i],mst[i]=0;
    int sum=0;
    lowcost[1]=1;
    mst[1]=1;
    for(int i=1;i<n;i++){
        int min=MAXCOST;
        int mink=1;
        for(int j=1;j<=n;j++){
            if(!mst[j]&&lowcost[j]<min)
            {
                min=lowcost[j];
                mink=j;
            }
        }
        mst[mink]=1;
        sum+=min;
        for(int j=1;j<=n;j++){
            if(!mst[j]&&map[mink][j]<lowcost[j])
                lowcost[j]=map[mink][j];
        }
    }
    if(sum<=0)
        printf("?\n");
    else
        printf("%d\n",sum);
}

 
int main()
{
    int m,n,a,b,c,cost;
    while(cin>>m>>n)
    {
        if(m==0)break;
        for (int i = 1; i <= n; i++) 
        for (int j = 1; j <= n; j++)  
        { 
            if(i!=j)
            map[i][j] = MAXCOST; 
            else
            map[i][i] = 0;
        }
        for (int i = 1; i <= m; i++) 
        {    
            cin>>a>>b>>c;
            if(c<map[a][b])
            map[a][b] = map[b][a] = c; 
        }
        prim(n);
    }
    return 0;
}

發佈了55 篇原創文章 · 獲贊 45 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章