算法学习--Day8
今天重拾算法复习。
今天学习了两个类型的算法——并查集与最小生成树(MST)
简单记录一下并查集的大致内容。
一、并查集的内容大致作用为查找当前图中的点有几个集合。
该算法起到查询分组的情况。通过给定的条件使用数组记录该点对应的父节点,倘若两个点有相同的“祖先”,那他们肯定是属于同一个组的。
下面看几道例题:
输入描述:
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
输出描述:
对每个测试用例,在1行里输出最少还需要建设的道路数目。
输入描述:
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
输出描述:
对每个测试用例,在1行里输出最小的公路总长度。
//
// Created by 陈平 on 2018/6/5.
// #include "iostream"
#include "stdio.h"
#include "algorithm"
using namespace std; int tree[];
struct Edge{
int a;
int b;
int value;
}edges[]; int findRoot(int a){
if(tree[a]==-) return a;
else{
int tmp = findRoot(tree[a]);
tree[a] = tmp;
return tmp;
}
}
bool cmp(Edge a,Edge b){
return a.value<b.value;
} int main(){
int n;
while (scanf("%d",&n)!=EOF&&n!=){
for (int i = ; i <=n*(n-)/ ; ++i) {
cin>>edges[i].a>>edges[i].b>>edges[i].value;
}
sort(edges+,edges+n*(n-)/+,cmp);
for (int j = ; j <=n ; ++j) {
tree[j]=-;
}
int ans=;
for (int k = ; k < n*(n-)/; ++k) {
int a,b;
a = findRoot(edges[k].a);
b = findRoot(edges[k].b);
if(a!=b){
tree[a]=b;
ans+=edges[k].value;
}
}
cout<<ans<<endl;
}
}
面对最小生成树的问题,我们的思路是将输入的路径进行从小到大的排序,并以此取合适的路径。
题目描述
输入描述:
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。 当N为0时输入结束。
输出描述:
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
//
// Created by 陈平 on 2018/6/6.
// #include "stdio.h"
#include "iostream"
#include "algorithm"
using namespace std; int tree[];
struct Edge{
int a;
int b;
int cost;
int flag;
}edges[]; int findRoot( int a){
if(tree[a]==-) return a;
else{
int tmp = findRoot(tree[a]);
tree[a] = tmp;
return tmp;
}
} bool cmp(Edge a,Edge b){
return a.cost<b.cost;
} int main(){
int n;
while (scanf("%d",&n)!=EOF && n!=){
for (int i = ; i <=n ; ++i) {
tree[i]=-;
}
int ans=;
for (int j = ; j <=n*(n-)/ ; ++j) {
cin>>edges[j].a>>edges[j].b>>edges[j].cost>>edges[j].flag;
if(edges[j].flag==){ //重点部分
int a,b;
a = findRoot(edges[j].a);
b = findRoot(edges[j].b);
if(a!=b) tree[a] = b;
}
}
sort(edges+,edges++n*(n-)/,cmp);
for (int k = ; k <=n*(n-)/ ; ++k) {
int a,b;
a = findRoot(edges[k].a);
b = findRoot(edges[k].b);
if(a!=b){
tree[a] = b;
ans+=edges[k].cost;
}
}
cout<<ans<<endl; }
}
算法学习--Day8的更多相关文章
- DSP算法学习-过采样技术
DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- PCA算法学习(Matlab实现)
PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的. 实现数据降维的步骤: 1.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...
随机推荐
- mac下执行文件出现Permission Denied的解决
mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读.写.可执行,你这个文件没有可执行权限,需要加上可执行权限. 1. 终端下先 cd到该文件的目录下 2 ...
- ZooKeeper学习笔记(一)
引导 刚开始学习ZooKeepter,看的书是[O'Reilly Media] ZooKeeper.下面的内容基本上是该书的翻译,很多语句也存在问题,大致读还是没问题的,自己在学习中记录. 第一章 Z ...
- 2016/07/07 PHP的线程安全与非线程安全版本的区别
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- 简单label控件 自制
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...
- 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码
本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...
- 预料外的变量值的改变是很多bug的源头
- windows IDA 调试SO
还是参考了网上的很多资料,感谢这些前辈的分享. ===================================================================== 环境:win ...
- 【LeetCode】Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- Android开发之onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法
onMeasure()函数由包含这个View的具体的ViewGroup调用,因此值也是由其ViewGroup中传入的.子类View的这两个参数widthMeasureSpec, heightMeasu ...
- SCOI2017 游记(AFO)
SCOI2017 游记(AFO) Day 0 上午模拟考,又tm用暴力a了一道题,心情舒畅.(要是省选也这样该有多好,2333) 晚上又去吃了什么不知名的东西,自己都忘了,总之好像很好吃的样子. Da ...