ZOJ 1406.Jungle Roads

给出所有村庄的所有通路,找出一条连接所有村庄花费最小的通路。

最小生成树的应用。此处用的是Prim算法。

#include<iostream>
#include<queue>
using namespace std;
struct Graph{
    //图邻接矩阵
    char data;
    int key;
    int *adjacency;
}*G;
int n;          //村庄数量
int m;          //邻接村庄数量
int *parent;    //在最短路径中连接村庄的上一个村庄
bool *visited;  //标识村庄是否已在最短路径上
int *key;       //本村庄离已有通路的村庄的最短距离
void Create(){
    //初始化
    parent = new int[n];
    visited = new bool[n];
    G = new Graph[n];
    for(int i=0; i<n; i++){
        G[i].adjacency = new int[n];
        G[i].key = 1<<30;
        visited[i] = false;
        parent[i] = -1;
        for(int j=0; j<n; j++){
            G[i].adjacency[j] = 0;
        }
    }
    for(int i=0; i<n-1; i++){
        cin>>G[i].data;
        cin>>m;
        for(int j=0; j<m; j++){
            char c;
            int pow;
            cin>>c>>pow;
            G[i].adjacency[c - 'A'] = G[c - 'A'].adjacency[i] = pow;
        }
    }
    G[n-1].data = n - 1 + 'A';
}
int Prim(){
    int result = 0;         //累加结果
    G[0].key = 0;
    for(int j=0; j<n; j++){
        int min = 0;
        for(int k=1; k<n; k++){
            if(G[min].key > G[k].key){
                min = k;
            }
        }
        visited[min] = true;
        result += G[min].key;
        G[min].key = 1<<30;
        for(int i=0; i<n; i++){
            if(!visited[i] && G[min].adjacency[i] && G[min].adjacency[i] < G[i].key){
                parent[i] = min;
                G[i].key =  G[min].adjacency[i];
            }
        }
    }
    return result;
}
int main(){
    while(cin>>n && n!=0){
        Create();
        cout<<Prim()<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值