搭建一个最小代价的网络,最原始的最小生成树的应用。

这里使用Union find和Kruskal算法求解.

注意:

1 给出的数据是原始的矩阵图,可是须要转化为边表示的图,方便运用Kruskal,由于须要sort

2 降低边。一个矩阵最多须要(N*N-N)>>1条边,有人讨论本题是否有向,那是无意义的。由于本题的最小生成树和方向无关。

3 使用Union find是为了推断是否有环。比原始推断快非常多。

#include <stdio.h>
#include <stdlib.h> const int MAX_VEC = 101;
int N; //number of vertices
struct SubSet
{
int p, rank;
}; struct Edge
{
int src, des, wei;
}; struct Graph
{
int V, E;
Edge *edge;
Graph(int v, int e) : V(v), E(e)
{
edge = new Edge[E];
}
~Graph()
{
if (edge) delete[]edge; edge = NULL;
}
}; static int cmp(const void *a, const void *b)
{
Edge *a1 = (Edge *) a;
Edge *b1 = (Edge *) b;
return a1->wei - b1->wei;
} SubSet *subs;
Edge *res;
Graph *gra; void initResource()
{
subs = new SubSet[N];
for (int i = 0; i < N; i++)
{
subs[i].p = i;
subs[i].rank = 0;
}
res = new Edge[N-1];
} inline void releaseResource()
{
if (subs) delete [] subs;
if (res) delete [] res;
} int find(int node)
{
if (subs[node].p != node)
subs[node].p = find(subs[node].p);
return subs[node].p;
} inline void unionTwo(int x, int y)
{
int xroot = find(x);
int yroot = find(y);
if (subs[xroot].rank < subs[yroot].rank) subs[xroot].p = yroot;
else if (subs[xroot].rank > subs[yroot].rank) subs[yroot].p = xroot;
else
{
subs[xroot].rank++;
subs[yroot].p = xroot;
}
} int mst()
{
initResource(); qsort(gra->edge, gra->E, sizeof(Edge), cmp);
for (int i = 0, v = 0; i < gra->E && v < gra->V - 1; i++)
{
int xroot = find(gra->edge[i].src);
int yroot = find(gra->edge[i].des); if (xroot != yroot)
{
unionTwo(xroot, yroot);
res[v++] = gra->edge[i];
}
} int ans = 0;
for (int i = 0; i < N-1; i++)
{
ans += res[i].wei;
}
releaseResource();
return ans;
} int main()
{
int w;
while (~scanf("%d", &N))
{
gra = new Graph(N, (N*N-N)>>1);
int e = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%d", &w);
if (j <= i) continue; //下三角形的值不入边 gra->edge[e].src = i;
gra->edge[e].des = j;
gra->edge[e++].wei = w;
}
}
printf("%d\n", mst());
delete gra;
}
return 0;
}

POJ1258 Agri-Net MST最小生成树题解的更多相关文章

  1. 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

    [BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...

  2. MST最小生成树

    首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...

  3. [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)

    1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 802  Solved: 344[Submit][Sta ...

  4. 【BZOJ2238】Mst 最小生成树+LCA+堆

    [BZOJ2238]Mst Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的 ...

  5. [BZOJ2238]Mst 最小生成树+树链剖分/并查集

    链接 题解 先构建出最小生成树,如果删的是非树边,直接输出答案 否则问题转化为,把该边删掉后剩下两个联通块,两个端点分别在两个块内的最小边权,LCT可以维护 不妨换一种思考方向:考虑一条非树边可以代替 ...

  6. [kuangbin]专题六 最小生成树 题解+总结

    kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...

  7. [poj1679]The Unique MST(最小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28207   Accepted: 10073 ...

  8. UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)

    题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...

  9. MST最小生成树及克鲁斯卡尔(Kruskal)算法

    最小生成树MST,英文名如何拼写已忘,应该是min spaning tree吧.假设一个无向连通图有n个节点,那么它的生成树就是包括这n个节点的无环连通图,无环即形成树.最小生成树是对边上权重的考虑, ...

随机推荐

  1. Android APK瘦身方法小结

    众所周知,APP包体的大小,会影响推广的难度,用户不太喜欢下载太大的APP,同类型同等功能的APP中往往是包体小的更受用户的青睐,所以降低包体是一项非常必要的事情,也是最近公司的APP需要降低包体,所 ...

  2. oracle odbc 驱动安装(不安装oracle客户端)

    1.下载odbc驱动 需要下载两个东西 instantclient-basiclite-nt-12.1.0.1.0.zip instantclient-odbc-nt-12.1.0.1.0.zip 由 ...

  3. 【CString与string转换】不存在从 "LPWSTR" 转换到 "std::basic_string<char, std::char_traits<char>, std::allocator(转)

    原文转自 http://blog.csdn.net/qq_23536063/article/details/52291332 [问题描述] CString cstr: sring str(cstr.G ...

  4. 转: wireshark过滤规则

    转: http://blog.sina.com.cn/s/blog_48a0f2740100ka71.html WireShark过滤语法 1.过 滤IP,如来源IP或者目标IP等于某个IP 例子: ...

  5. ubuntu默认用户分析

    harvey@ubuntu:/etc$ cat -b passwd root:x:::root:/root:/bin/bash daemon:x:::daemon:/usr/sbin:/bin/sh ...

  6. Simditor 富文本编辑器

    Simditor 是团队协作工具 Tower 使用的富文本编辑器. 相比传统的编辑器它的特点是: 功能精简,加载快速 输出格式化的标准 HTML 每一个功能都有非常优秀的使用体验 兼容的浏览器:IE1 ...

  7. hdu 5062(水题)

    Beautiful Palindrome Number Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. AC日记——小M的作物 bzoj 3438

    3438 思路: 最小割(完全不懂看的题解): s向每个作物连边,s-x ai,x-t bi: 然后s向作物集合连边,cia: 作物集合拆点向t连边,cib: 作物集合第一个点向作物连边INF: 作物 ...

  9. 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...

  10. UVA10305 Ordering Tasks (拓扑序列)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398586.html 题意: 假设有N个变量,还有M个二元组(u, v),分别表示变量u 小于 v.那么.所有变量从小到大 ...