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