Prim算法

Posted vbel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prim算法相关的知识,希望对你有一定的参考价值。

适用范围

最小生成树问题

思路

核心思想:贪心.对于一幅连通图,首先,先假设有一个只包含顶点v的数T,然后贪心选取T和其他点之间的最小权值的边,然后把它加入T,不断进行这个操作直到所有点的都在T里,这时T就是最小生成树.prim算法和dijkstra算法很相似,实现的时候也差不多,基础算法像dijkstra一样可优化,用优先队列来优化选最小权值的边的过程.优化后复杂度(ElogV) E边V点

代码

 1 typedef pair<int,int> P;//first是边权值,second是点 
 2 struct edge{int to,cost;};
 3 vector<edge> es[MAX];
 4 bool used[MAX]; //点编号从1开始 
 5 
 6 int prim(void) 
 7 {
 8     priority_queue<P,vector<P>,greater<P> > que;
 9     int ans=0;
10     used[1]=true;
11     for(int i=0;i<es[1].size();i++)
12     que.push(P(es[1][i].cost,es[1][i].to));
13     while(que.size())
14     {
15         P p=que.top();que.pop();
16         int x=p.second;
17         if(used[x]) continue;
18         used[x]=true;
19         ans+=p.first;
20         for(int i=0;i<es[x].size();i++)
21         if(!used[es[x][i].to]) que.push(P(es[x][i].cost,es[x][i].to)); 
22     }
23     return ans;
24 }

 

以上是关于Prim算法的主要内容,如果未能解决你的问题,请参考以下文章

Prim算法与Kruskal(没有代码)

Prim 算法和 Dijkstra 算法的区别?

关于最小生成树的Prim算法和Kruskal算法

最小生成树-Prim算法详解(含全部代码)

最小生成树及Prim算法及Kruskal算法的代码实现

Prim算法