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算法的主要内容,如果未能解决你的问题,请参考以下文章