最小生成树-Kruskal算法(模板)
2016-08-25 10:49
288 查看
Kruskal基本算法:每次选取最短的边,看该边相连的两点是否在同一集合内,若在,则跳过,若不在,就把两个点合并,判断与合并都用并查集实现。
Kruskal的复杂度是O(ElogE),适合稀疏图。
Kruskal的复杂度是O(ElogE),适合稀疏图。
/* Kruskal算法求MST */ #include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #include<fstream> using namespace std; const int MAXN=505;//最大点数 const int MAXM=250005;//最大边数 int F[MAXN];//并查集使用 struct Edge { int u,v,w; }edge[MAXM];//储存边的信息,包括起点/终点/权值 int tol;//边数,加边前赋值为0 void addedge(int u,int v,int w) { edge[tol].u=u; edge[tol].v=v; edge[tol++].w=w; } bool cmp(Edge a,Edge b)//排序函数,边按照权值从小到大排序 { return a.w<b.w; } int Find(int x) { if(F[x]==-1) return x; else return F[x]=Find(F[x]); } int Kruskal(int n)//传入点数,返回最小生成树的权值,如果不连通返回-1 { memset(F,-1,sizeof(F)); sort(edge,edge+tol,cmp); int cnt=0;//计算加入的边数 int ans=0; for(int i=0;i<tol;i++) { int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int t1=Find(u); int t2=Find(v); if(t1!=t2) { ans+=w; F[t1]=t2; cnt++; } if(cnt==n-1) break; } if(cnt<n-1) return -1;//不连通 else return ans; } int main() { //freopen("in.txt","r",stdin); int T; cin>>T; int n; int c; while(T--) { cin>>n; tol=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>c; addedge(i,j,c); } } cout<<Kruskal(n)<<endl; } return 0; }
相关文章推荐
- hdu1233最小生成树 kruskal算法模板
- 最小生成树-Kruskal算法模板
- 最小生成树(MST)模板---Kruskal算法
- 【2018寒假集训Day 8】【最小生成树】Prim和Kruskal算法模板
- 最小生成树kruskal算法模板
- Kruskal算法(图的最小生成树)(模板)
- HDU1233 还是畅通工程(最小生成树模板题,Prime,kruskal算法)
- [模板]最小生成树 kruskal算法
- 最小生成树 kruskal算法模板
- 最小生成树-Kruskal算法(模板) 蓝桥杯 - 算法训练 - ALGO - 6 安慰奶牛(克鲁斯卡尔)
- 最小生成树Kruskal算法【模板】 与 并查集 例题:简单 poj 2485 Highways
- 求解最小生成树的算法 kruskal算法(附模板)
- 图论——最小生成树Kruskal算法模板
- caioj1090·最小生成树(模板 Kruskal算法)
- 求解最小生成树——kruskal算法模板
- POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)
- (模板)最小生成树,Kruskal算法
- 【最小生成树】(模板-kruskal算法)hdu 1863 畅通工程
- 最小生成树(prim算法与kruskal算法)(模板)
- Hihocoder #1098 : 最小生成树二·Kruskal算法 ( *【模板】 )