poj 2377最大生成树 Kruskal

来源:互联网 发布:mac怎么卸载第三方软件 编辑:程序博客网 时间:2024/05/24 00:13

点击打开链接

#include <iostream>#include <algorithm>using namespace std;const int M = 21010;struct edge{int u;int v;long long cost;bool operator <(const edge &t)const{return cost>t.cost; }}e[M];int n,m,fa[M];void Inin(){for(int i=1;i<=n;i++){fa[i]=i;}}int find(int x){if(x!=fa[x]){fa[x]=find(fa[x]); //路径压缩}return fa[x];}void Union(int x,int y){int a=find(x);int b=find(y);if(a!=b){fa[a]=b;}}void Kruskal(){Inin();// union-set 初始化 long long ans=0;for(int i=0;i<m;i++){if(find(e[i].u)!=find(e[i].v)){Union(e[i].u,e[i].v);ans+=e[i].cost; n--;}if(n==1)break;}if(n==1)cout<<ans<<endl;else// 连不通 cout<<-1<<endl;}int main() {cin>>n>>m;for(int i=0;i<m;i++){cin>>e[i].u>>e[i].v>>e[i].cost;}sort(e,e+m);Kruskal();//将n个连通分量变减少至1个(最小生成树)时 所用花费最少 return 0;}


0 0
原创粉丝点击