模板 最小生成树
Posted lyhhahaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 最小生成树相关的知识,希望对你有一定的参考价值。
堆优化的prim算法(跟dijkstra非常的像)
#include<iostream> #include<queue> #include<vector> using namespace std; const int inf=99999999; int n,m; vector<pair<int,int> >g[5005];//第一位是距离,第二位使编号 int book[5005],dis[5005]; priority_queue<pair<int,int> >q;//大根堆 int prim() { int i,ans=0; for(i=1;i<=n;i++)dis[i]=inf; dis[1]=0; q.push(make_pair(0,1)); int top=0; while(q.size())//一共加入MSTn个点 { int x=q.top().second; q.pop(); if(book[x]==1)continue;//一个点只能出一次堆 book[x]=1; ans+=dis[x]; for(i=0;i<g[x].size();i++) { int y=g[x][i].second; int yy=g[x][i].first; if(book[y]==0&&dis[y]>yy) { dis[y]=yy; q.push(make_pair(-dis[y],y)); } } } return ans; } void solve() { cin>>n>>m; for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; g[a].push_back(make_pair(c,b)); g[b].push_back(make_pair(c,a)); } cout<<prim()<<endl; } int main() { solve(); }
kruskal
#include<iostream> #include<algorithm> using namespace std; int n,m; struct pp { int from,to,w; }e[200005]; int par[50005];//并查集 void init(int n) { int i; for(i=1;i<=n;i++)par[i]=i; } int find(int x) { if(x==par[x])return x; return par[x]=find(par[x]);//x的父亲是树根 } void unite(int x,int y) { x=find(x); y=find(y); if(x==y)return; par[x]=y; } bool same(int x,int y) { return find(x)==find(y); } bool cmp(pp a,pp b) { return a.w<b.w; } int kruskal() { int ans=0; init(n); sort(e+1,e+m+1,cmp); for(int i=1;i<=m;i++) { int x=e[i].from; int y=e[i].to; int z=e[i].w; if(same(x,y)!=true)//不在一个联通块中 { unite(x,y); ans+=z; } } return ans; } void solve() { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>e[i].from>>e[i].to>>e[i].w; } cout<<kruskal()<<endl; } int main() { solve(); }
个人感觉kruskal比prim跟好写一点
以上是关于模板 最小生成树的主要内容,如果未能解决你的问题,请参考以下文章