prim算法求最小生成树

Posted st-lovaer

tags:

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

简单的纯板。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
");
36             return;
37         }
38     } 
39     printf("%d
",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算法求最小生成树的主要内容,如果未能解决你的问题,请参考以下文章

急!数据结构最小生成树prim算法C语言实现

最小生成树的prim算法 边的权值为啥不能为负值

最小生成树的prim算法 边的权值为啥不能为负值

Prim算法和Kruskal算法求最小生成树

prim和kruscal算法得到的最小生成树是不是一样

急求KRUSKAL算法求最小生成树过程演示