POJ-1251-Jungle Roads(Prim算法-最小生成树-模板题目)

POJ-1251-Jungle Roads

本代码模板抄录自kuangbin模板集


/*
Prim算法求最小生成树的权值
耗费邻接矩阵 cost[][],标号从 0 开始,0∼n-1
返回最小生成树的权值,返回 -1 表示原图不连通
*/
const int inf = 0x3f3f3f3f;
const int maxn = 110;
bool vis[maxn];
//编号为i的结点通过权值为lowc[i]的边连入了最小生成树
int lowc[maxn];

//(权值的邻接矩阵,结点总个数)
int Prim(int cost[][maxn],int n){
    int ans = 0;
    memset(vis,false,sizeof(vis));
    vis[0] = true;
    for(int i=1;i<n;i++){
        lowc[i] = cost[0][i];
    }
    for(int i=1;i<n;i++){
        int minc = inf;
        int p = -1;
        for(int j=0;j<n;j++){
            if(!vis[j] && minc>lowc[j]){
                minc = lowc[j];
                p = j;
            }
        }
        if(minc == inf)return -1;
        ans += minc;
        vis[p] = true;
        for(int j=0;j<n;j++){
            if(!vis[j] && lowc[j]>cost[p][j]){
                lowc[j] = cost[p][j];
            }
        }
    }
    return ans;
}

下面是模板题目的解法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

/*
Prim 求最小生成树的权值
耗费矩阵 cost[][],标号从 0 开始,0∼n-1
返回最小生成树的权值,返回 -1 表示原图不连通
*/

const int inf = 0x3f3f3f3f;
const int maxn = 110;
bool vis[maxn];

//编号为i的结点通过权值为lowc[i]的边连入了最小生成树
int lowc[maxn];

//(权值的邻接矩阵,结点总个数)
int Prim(int cost[][maxn],int n){
    int ans = 0;
    memset(vis,false,sizeof(vis));
    vis[0] = true;
    for(int i=1;i<n;i++){
        lowc[i] = cost[0][i];
    }
    for(int i=1;i<n;i++){
        int minc = inf;
        int p = -1;
        for(int j=0;j<n;j++){
            if(!vis[j] && minc>lowc[j]){
                minc = lowc[j];
                p = j;
            }
        }
        if(minc == inf)return -1;
        ans += minc;
        vis[p] = true;
        for(int j=0;j<n;j++){
            if(!vis[j] && lowc[j]>cost[p][j]){
                lowc[j] = cost[p][j];
            }
        }
    }
    return ans;
}

int cost[maxn][maxn];//权值的邻接矩阵
int n;//结点总个数

int readin(){
    scanf("%d",&n);
    if(n==0)return 0;
    getchar();
    for(int i=0;i<n;i++){
        for(int k=0;k<n;k++){
            cost[i][k] = inf;
        }
    }//完成初始化
    for(int i=0;i<n-1;i++){
        char ch;int len;
        cin>>ch>>len;
        //cout<<ch<<" "<<len<<endl;
        while(len--){
            char p;int v;
            cin>>p>>v;
            cost[ch-'A'][p-'A']=cost[p-'A'][ch-'A']=v;
        }
        getchar();
    }
    return 1;
}

int main(){
    //freopen("in.txt","r",stdin);
    while(readin()){
        //cout<<"OK"<<endl;
        cout<<Prim(cost,n)<<endl;
        //
        /*for(int i=0;i<n;i++){
            cout<<i<<"=>"<<lowc[i]<<endl;
        }*///可以通过输出lowc确定最小生成树的形态
        break;
    }
    return 0;
}

给一个测试样例

9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
0

ans = 216

关于样例的图解释:

OK

posted @ 2020-10-12 23:19  SavenNeer  阅读(86)  评论(0编辑  收藏  举报