码迷,mamicode.com
首页 > 编程语言 > 详细

Prim算法

时间:2019-04-14 18:07:50      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:continue   其他   算法   sof   cond   优先队列   代码   font   包含   

适用范围

最小生成树问题

思路

核心思想:贪心.对于一幅连通图,首先,先假设有一个只包含顶点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算法

标签:continue   其他   算法   sof   cond   优先队列   代码   font   包含   

原文地址:https://www.cnblogs.com/VBEL/p/10704782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!