Prim最小生成树算法

原创 2007年09月19日 13:51:00

MST-PRIM(G, w, r)
// G: graph, w: weight,  r:root 
1  for each u V [G]
 2       do key[u]  
 3          π[u]  NIL
 4  key[r]  0
 5   Q  V [G]
 6   while Q  Ø
 7       do u  EXTRACT-MIN(Q)
 8          for each v  Adj[u]
 9              do if v  Q and w(u, v) < key[v]
10                    then π[v]  u
11                         key[v]  w(u, v)

Prim's algorithm works as shown in the figure:
http://p.blog.csdn.net/images/p_blog_csdn_net/touzani/303255/o_prim.JPG
// MST  set实现最小优先级队列
#include <vector>
#include 
<set>

int MST_PRIM(const vector<vector<pair<intint> > > & G)
/*
  • index start from 1 to n and
  • G.size() -1 is the number of vertices in our graph
  • G[i].size() is the number of vertices directly reachable from vertex with index i
  • G[i][j].first is the index of j-th vertex reachable from vertex i
  • G[i][j].second is the length of the edge heading from vertex i to vertex G[i][j].first 
         return the minimum cost of the spanning tree
*/
{
    
int n = G.size();
    vector
<int> key (n, 987654321);
    vector
<bool> belongQ(n, 1);
    key[
1]=0;
    
set<pair<intint> > Q;
    
for(int i=1; i<n; i++
        Q.insert(make_pair(key[i], i));
    
while (!Q.empty()) {
        
int u=Q.begin()->second;
        Q.erase(Q.begin());
        belongQ[u]
=false;
        
for(int i=0; i< G[u].size(); i++{
            
int v = G[u][i].first;
            
if(belongQ[v] && G[u][i].second < key[v]) {
                Q.erase(Q.find(make_pair(key[v], v)));
                key[v]
=G[u][i].second;
                Q.insert(make_pair(key[v], v));
            }

        }

    }
 
    
int res=0;
    
for(int i=1; i < n; i++
        res
+=key[i];
    
return res;
}
 
题目:http://acm.pku.cn/JudgeOnline/problem?id=1251 jungle roads   
            http://acm.pku.cn/JudgeOnline/problem?id=1287 Networking

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

图——Prim最小生成树算法(矩阵方式实现)

图的最小生成树矩阵算法

Prim最小生成树算法

prim 算法主要要解决问题1、 尽可能选取权值小的边,但不能构成回路;2、 选取n-1条恰当的边以连通n个顶点; primMST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集。若(u...

最小生成树算法(Prim和Kruskal)

无向连通图的最小生成树         设G=(V,E)是一个无向连通图,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树即为其最小生成树。 Prim(普里姆...

prim最小生成树算法

算法描述:设定两个集合U和V,刚开始时U为空,V为全体顶点集合。在V中任取一点加入到U中,记录该点到其他V中顶点的距离,从中选取最小的一边及其在V中对应的顶点。将该顶点加入到U中,更新U中顶点到V中各...

PAT 数据结构 06-图6. 公路村村通(30)Prim最小生成树算法

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。 输入格式说明: 输入数据包括城镇数目正整数N( 输出格式说明: 输出村村...

C++实现Prim与Kruskal最小生成树算法

C++实现Prim与Kruskal最小生成树算法Edge.h#ifndef EDGE_H #define EDGE_H#include using namespace std;class Edge {...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)