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

prim算法求最小生成树

时间:2019-11-03 01:23:29      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:==   堆优化   个数   生成树   str   namespace   sizeof   push   names   

简单的纯板。prim算法适合稠密图,kruskal算法适合简单图。prim算法复杂度O(n^2),n是图中点的个数,kruskal算法复杂度O(eloge),e为图中边的条数。值得一提的是,加入堆优化的prim算法复杂度可达O(nloge)。

这个是用链式前向星存边+堆优化的prim算法。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5005;
 4 struct Edge{
 5     int to,dist;
 6     Edge(int t,int d):to(t),dist(d){}
 7     bool operator<(const Edge& e)const{
 8         return dist>e.dist;
 9     }
10 };
11 int n,m;
12 bool vis[maxn];
13 vector<Edge> g[maxn];
14 priority_queue<Edge> que;
15 void prim(){
16     memset(vis,0,sizeof(vis));
17     while(que.size()) que.pop();
18 
19     for(int i=0;i<g[0].size();++i) que.push(g[0][i]);
20     vis[0]=true;
21 
22     int ans=0;
23     for(int cnt=1;cnt<n;++cnt){
24         while(que.size() && vis[que.top().to]) que.pop();
25         Edge e=que.top();
26         ans+=e.dist;
27         int v=e.to;
28         vis[v]=true;
29         for(int i=0;i<g[v].size();++i){
30             if(!vis[g[v][i].to]) que.push(g[v][i]);
31         }
32     }
33     for(int i=0;i<n;i++){
34         if(vis[i]==false){
35             printf("orz\n");
36             return;
37         }
38     } 
39     printf("%d\n",ans);
40 }
41 
42 int main(){
43     while(scanf("%d%d",&n,&m)==2){
44         for(int i=0;i<n;++i) g[i].clear();
45         for(int i=0;i<m;++i){
46             int u,v,w;
47             scanf("%d%d%d",&u,&v,&w);
48             g[u-1].push_back(Edge(v-1,w));
49             g[v-1].push_back(Edge(u-1,w));
50         }
51         prim();
52     }
53     return 0;
54 }

prim算法求最小生成树

标签:==   堆优化   个数   生成树   str   namespace   sizeof   push   names   

原文地址:https://www.cnblogs.com/St-Lovaer/p/11779888.html

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