DS实验题 PlayGame Kruskal(UnionFindSet)
题目:

思路:
有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考:最小生成树-Prim算法和Kruskal算法,讲的已经是十分清楚了。
具体算法实现:
1.首先用结构体数组存储输入的边,并且初始化一个并查集思想中的父亲数组fa[i];
2.用sort根据边权进行排序,边权小的边在前,大的在后;
3.从1到m遍历已经排好序的边
(1)遍历到边i,其两个节点分别是a和b,查找两个节点的祖先A和B
(2)如果A == B,加入边i会形成环路,则跳过该边,continue。
(3)如果A != B,进行祖先之间的Union:执行 fa[A] = B 或者 fa[B] = A,之后进行计数器的自增以及最小生成树长度的记录。
4.当加入的边为n-1条时(通过计数器反映),结束循环。
其中非常需要注意的一点是,并查集的合并,指的是祖先之间的合并。
代码
//
// main.cpp
// Kruskal
//
// Created by wasdns on 16/12/22.
// Copyright © 2016年 wasdns. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct stedge
{
int u, v, len;
};
bool cmp(stedge s1, stedge s2)
{
return s1.len < s2.len;
}
stedge seg[100000];
int fa[100005];
void Inifa(int n)
{
for (int i = 1; i <= n; i++)
{
fa[i] = i;
}
}
int findfa(int x)
{
int f = x;
while (f != fa[f])
{
f = fa[f];
}
int i = x, j;
while (i != f)
{
j = fa[i];
fa[i] = f;
i = j;
}
return f;
}
int main()
{
int i, n, m;
cin >> n >> m;
Inifa(n);
int u, v, w;
for (i = 1; i <= m; i++)
{
cin >> u >> v >> w;
seg[i].u = u;
seg[i].v = v;
seg[i].len = w;
}
sort(seg+1, seg+m+1, cmp);
int cnt = 0, lencnt = 0;
for (i = 1; i <= m; i++)
{
int fa1 = findfa(seg[i].u);
int fa2 = findfa(seg[i].v);
if (fa1 == fa2) continue;
cnt++;
lencnt += seg[i].len;
fa[fa1] = fa2; //一定是祖先找祖先合并
if (cnt == n-1) break;
}
cout << lencnt;
return 0;
}
/*
4
6
1 2 1
2 3 2
1 3 3
2 4 3
3 4 5
1 4 4
*/
2016/12/22
DS实验题 PlayGame Kruskal(UnionFindSet)的更多相关文章
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- DS实验题 融合软泥怪-2 Heap实现
题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...
- DS实验题 Dijkstra算法
参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...
- DS实验题 sights
算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...
- DS实验题 order
算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...
- DS实验题 Old_Driver UnionFindSet结构
题目 思路 很典型的并查集问题,朋友A和B要合并到一个统一的集合中,也就是Union(A, B)操作,在Union操作中需要先找到A所属的集合的代表元和B所属集合的代表元,也就是使用Find(A)和F ...
- DS实验题 Order 已知父节点和中序遍历求前、后序
题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...
- DS实验题 Inversion
题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...
- DS实验题 Missile
题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...
随机推荐
- ArcGIS 点到直线的距离
/****点到直线的距离*** * 过点(x1,y1)和点(x2,y2)的直线方程为:KX -Y + (x2y1 - x1y2)/(x2-x1) = 0 * 设直线斜率为K = (y2-y1)/(x2 ...
- JS验证金额
<script type="text/javascript"> function ismoney(obj) { check(obj) ...
- 优化WPF 3D性能
Maximize WPF 3D Performance .NET Framework 4.5 As you use the Windows Presentation Foundation (WPF ...
- BZOJ 1412 & 最小割
什么时候ZJ省选再现一次这么良心的题吧... 题意: 在一个染色的格子画分割线,使其不想连,求最少的线段 SOL: 裸裸的最小割.题目要求两种颜色不想连,我们把他分到两个集合,也就是把所有相连的边切断 ...
- 一个动画 Label (走马观花)
UILabel中一个水平移动的Label UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 300)]; U ...
- 转自虫师:性能测试的 Check List
原文地址:http://www.cnblogs.com/jackei/archive/2006/03/24/357372.html 1. 开发人员是否提交了测试申请? 2. 测试对象是否已经明确? 3 ...
- PHP程序员 新人求职 平台
投简历网站:大街网:中下,但是反馈速度不错拉勾网:中上,工资好像很多都很不错实习僧:不太熟悉,中等吧猎聘网:好像不错,本人不常用海投网:不清楚,没用过以上评级都是个人感觉而已,不代表正式评价个人感觉以 ...
- iOS 开发技巧总结
1.添加定时器的常用代码 - (void)delayEnableTabButton { self.tabChannelButton.enabled = NO; [self appendTimer]; ...
- iOS 自动布局小结
1> sizeclasses 可以限制某个 storyboard 显示在什么样的屏幕上,如 当前 storyboard 在iPhone 的左斜右斜或 iPad上是否显示.. 2> Hug值 ...
- Linux下bash: scp: command not found问题 或者装ssh包时报错 Requires: libedit.so.0()(64bit)
一.用scp命令从物理主机向CentOS 6.1虚拟机传送文件,提示以下错误:bash: scp: command not found到CentOS 6.1虚拟机查看也缺少scp命令.该虚拟机 ...