poj 2421
2013-08-17 17:46
369 查看
kruskal算法:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> const int maxn = 110; using namespace std; int rt[maxn]; struct edge{ int l,r,w; }ee[maxn*maxn]; int map[maxn][maxn],flag[maxn][maxn]; int nedge;//路的条数 bool Cmp(edge x, edge y){ return x.w < y.w; } void Build(int n){ for(int i = 1; i <= n; ++i) rt[i] = i; } int Find(int x){ if(rt[x] == x) return x; return Find(rt[x]); } void Union(int x, int y){ int xrt = rt[x]; int yrt = rt[y]; if(xrt != yrt) rt[xrt] = yrt; } int Kruskal(){ int rt1,rt2,ans=0; for(int i = 0; i < nedge; ++i){ rt1 = Find(ee[i].l); rt2 = Find(ee[i].r); if(rt1 != rt2){ ans += ee[i].w; Union(rt1,rt2); } } return ans; } int main() { int n; while(~scanf("%d",&n)){ Build(n); for(int i = 1; i <= n; ++i) for(int j = 1; j <= n ; ++j) scanf("%d",&map[i][j]); nedge = 0; for(int i = 1; i < n; ++i) for(int j = i+1; j <= n; ++j){ ee[nedge].l = i; ee[nedge].r = j; ee[nedge].w = map[i][j]; nedge++; } int m; scanf("%d",&m); while(m--){ int a,b; scanf("%d %d",&a,&b); int rt1 = Find(a); int rt2 = Find(b); Union(rt1,rt2); } sort(ee,ee+nedge,Cmp); printf("%d\n",Kruskal()); } return 0; }
相关文章推荐
- poj 2421
- poj 2421 Constructing Roads 并查集+最小生成树
- 【Prim】-POJ-2421-构造公路
- POJ--2421--Constructing Roads
- POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )
- POJ 2421 Constructing Roads(最小生成树)
- POJ 2421 Constructing Roads
- poj 2421 Constructing Roads
- poj-2421 Constructing Roads *
- POJ 2421 Constructing Roads Kruskal+并查集
- POJ 2421 Constructing Roads 解题报告
- POJ 2421 Constructing Roads
- poj 2421 hdu 1102 Constructing Roads
- POJ 2421 有一条连通下的最小生成树
- poj 2421 Constructing Roads(kruskal)(基础)
- POJ 2421 Constructing Roads 笔记
- POJ-2421 Constructing Roads
- POJ2421 prim算法求最小生成树
- poj 2421 Constructing Roads(最小生成树 kruskal算法)
- [kuangbin带你飞]专题六 最小生成树 D POJ 2421