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个节点的无环连通图,无环即形成树.最小生成树是对边上权重的考虑, ...
随机推荐
- elementui 日期选择器设置当前默认日期(picker-options),以及当前日期以后的无法选择(default-value)
目前官方的日期默认是当前日期,打开之后长这样子:现在是三月13日,但是有的需求是当前日期在后面. 就像这样: 代码如下: default-value是设置当前日期默认值的."timeDefa ...
- Windows注册与删除mysql服务
1.删除服务: (1)采用windows自带的服务管理工具:参考:http://www.cnblogs.com/qlqwjy/p/8010598.html sc delete MySQL57 (2)m ...
- WinForm Control.Invoke&Control.BeginInvoke异步操作控件实例
参考:http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html 效果图: 实例(实验)代码: using System; using ...
- AsBcd的意思
- .apache.commons.io 源代码学习(一)
java的初学者,准备通读各种高水平源代码,提升能力. 为了避免自己的惰性,写博客. 版本:2.5 开发平台:netbeans. 今天是第一天,网上先看个例子:http://www.importnew ...
- (26)C#WebService
一.创建webservice 二.发布webservice 1.正式发布 (1)配置IIS 自己在局域网用的话,只需1,2,3 三步 1:网站的名称,将来IIS里有多个网站时可以方便区分 2:文件的本 ...
- 洛谷 P1064 金明的预算方案【DP/01背包-方案数】
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...
- Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)
Finally the Great Magical Lamp was in Aladdin's hand. Now he wanted to return home. But he didn't wa ...
- CodeForces - 985F Isomorphic Strings
假如两个区间的26的字母出现的位置集合分别是 A1,B1,A2,B2,....., 我们再能找到一个排列p[] 使得 A[i] = B[p[i]] ,那么就可以成功映射了. 显然集合可以直接hash, ...
- NOI2016 高中OI生涯的最后一站
你乘坐的航班XXX已经抵达终点站——四川绵阳. “呼——”机舱外的天空灰沉沉的,不禁有些压抑与紧张. 一出机场,就看见南山中学的牌子,黄色衣服的志愿者们,还有热情的老师们. 感觉刚才的情绪又一扫而空了 ...