106_Prime 最小生成树

来源:互联网 发布:丁丁长度知乎 编辑:程序博客网 时间:2024/05/19 15:25

  最小生成树的Prime算法,用优先队列来实现。

 《挑战程序竞赛》中, 使用一个min_cost数组来保存最小生成树倒每个结点的最短距离,每次操作对V进行循环;

  对比了一下,以下程序,基于与最小生成树相连的边的优先队列,分析了一下不一定能占到便宜。


////  106_Prime.cpp//  changlle////  Created by user on 1/1/16.//  Copyright (c) 2016 user. All rights reserved.//#include <iostream>#include <vector>#include <queue>using namespace std;int min_cost=0;struct edge {    int cost;    int to;};vector<edge> G[4];bool used[4];typedef pair<int,int> P;int V=4;int main() {    edge e={1,1};    G[0].push_back(e);    e={4,3};    G[0].push_back(e);        e={2,2};    G[1].push_back(e);    e={5,3};    G[1].push_back(e);    e={1,0};    G[1].push_back(e);            e={3,3};    G[2].push_back(e);    e={2,1};    G[2].push_back(e);        e={4,0};    G[3].push_back(e);    e={3,2};    G[3].push_back(e);    e={5,1};    G[3].push_back(e);                   priority_queue<P, vector<P>, greater<P>> que;        for (int i=0; i<G[0].size();i++)    {        P e;        e.first=G[0][i].cost;        e.second=G[0][i].to;        que.push(e);    }        int n=1;    fill (used, used+V, false);    used[0]=true;        while (n<V) {                P e=que.top(); que.pop();        min_cost=min_cost+e.first;        n++;        used[e.second]=true;        int now=e.second;                for (int j=0; j<G[now].size();j++)        {            if (!used[G[now][j].to]){                P e_1;                e_1.first=G[now][j].cost;                e_1.second=G[now][j].to;                que.push(e_1);            }        }                    }                    cout<<min_cost<<endl;            return 0;}


0 0
原创粉丝点击