POJ1258 Agri-Net MST最小生成树题解
搭建一个最小代价的网络,最原始的最小生成树的应用。
这里使用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最小生成树题解的更多相关文章
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 802 Solved: 344[Submit][Sta ...
- 【BZOJ2238】Mst 最小生成树+LCA+堆
[BZOJ2238]Mst Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的 ...
- [BZOJ2238]Mst 最小生成树+树链剖分/并查集
链接 题解 先构建出最小生成树,如果删的是非树边,直接输出答案 否则问题转化为,把该边删掉后剩下两个联通块,两个端点分别在两个块内的最小边权,LCT可以维护 不妨换一种思考方向:考虑一条非树边可以代替 ...
- [kuangbin]专题六 最小生成树 题解+总结
kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...
- [poj1679]The Unique MST(最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28207 Accepted: 10073 ...
- UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)
题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...
- MST最小生成树及克鲁斯卡尔(Kruskal)算法
最小生成树MST,英文名如何拼写已忘,应该是min spaning tree吧.假设一个无向连通图有n个节点,那么它的生成树就是包括这n个节点的无环连通图,无环即形成树.最小生成树是对边上权重的考虑, ...
随机推荐
- clips 前端 js 单选按钮与输入框 的配合变化
情形1: 一对单选按钮 一个输入框组 输入框组随单选按钮的改变而替换文字或执行其它 片段属于 介绍单选框的基本使用方式 : 1.单选框是有分类的,每个单选框有自己所属的组 从而一个页面可以拥有多组单 ...
- [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算
题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...
- RelativeSource
当一个Binding有明确的数据来源时可以通过为Source或ElementName赋值的办法让Binding与之关联,有的时候由于不能确定Source的对象叫什么名字,但知道它与作为Binding目 ...
- Linux下的GitHub安装与简单配置教程 ~ 转载
Linux下的GitHub安装与简单配置教程 1.GitHub简介 Git是一个分布式版本控制系统,与其相对的是CVS.SVN等集中式的版本控制系统. 2.Git的安装 1)安装Git a.查看与 ...
- Android 系统启动过程详解
android 使用 linux 内核,一般运行在 ARM 体系架构上,android 设备启动的过程,应用层之下基本等同于linux, 从应用层第一个程序init开始有所区别,下面开始介绍. ste ...
- shell 将字符串分割成数组
代码:test.sh #!/bin/bash a="one,two,three,four" #要将$a分割开,可以这样: OLD_IFS="$IFS" IFS= ...
- Java定义bean实体类中的变量时变量名的问题
首先:TMD,这个问题花了我两个多小时,居然是因为一个字母的大小写导致的,我瞬间就&Y^%^&%&()*%¥%¥¥&^#@%&; 事情是酱紫的: 我定义了一个变 ...
- Codeforces538F A Heap of Heaps(函数式线段树)
题意:给你一个数组a[n],对于数组每次建立一个完全k叉树,对于每个节点,如果父节点的值比这个节点的值大,那么就是一个违规点,统计出1~n-1完全叉树下的违规点的各自的个数. 一个直觉的思想就是暴力, ...
- Codeforces Round #448 (Div. 2) B. XK Segments【二分搜索/排序/查找合法的数在哪些不同区间的区间数目】
B. XK Segments time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- springMVC笔记:@ResponseBody
使用@ResponseBody的方式,将Map形返回值转为json,用作POST请求的返回值.为了解决406 Not Acceptable错误,需要检查以下几项: 1. 依赖包中包含jackson-m ...