ZOJ 1406.Jungle Roads

来源:互联网 发布:上门修手机 知乎 编辑:程序博客网 时间:2024/05/20 16:41

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

最小生成树的应用。此处用的是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;}


原创粉丝点击