Prim算法

适用范围

最小生成树问题

思路

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

代码

 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 }

 

posted @ 2019-04-14 17:31  VBL  阅读(215)  评论(0编辑  收藏  举报