算法学习--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.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...
随机推荐
- 第一个php小程序(学习)
</pre><pre name="code" class="php"><? php $b=array("name&quo ...
- properties配置文件读取
1.配置文件test.properties: test_123=admin 注:value 可用单引号,双引号,不用引号修饰 2.工具类PropertiesUtil: package com..... ...
- linux新建文件和文件夹命令
1.touch命令 touch命令用来修改文件的访问时间.修改时间.如果没有指定时间,则将文件时间属性改为当前时间. 当指定文件不存在,touch命令变为创建该文件. 语法: touch [-acm] ...
- 【TensorFlow-windows】(四) CNN(卷积神经网络)进行手写数字识别(mnist)
主要内容: 1.基于CNN的mnist手写数字识别(详细代码注释) 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_64. ...
- CSU 1554 SG Value —— 思维
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1554 Description The SG value of a set (mult ...
- 加快你的JavaScript加载时间
发现可以提速的内容 你必须首先发现你的什么图片和HTML加载缓慢了你的脚本速度,下面提供了方法: 1. Firefox web-developer toolbar 2. Firebug Plugi ...
- C# 获取utc时间,以及utc datetime 互相转化
C# 获取utc时间,以及utc datetime 互相转化 大部分源于http://blog.sina.com.cn/s/blog_4c6e822d0102dsdz.html 刚开始学习一点C# ...
- 使用idea导入远程git版本库项目
1.选择git方式导入 2.设置远程git项目地址 3.测试是否连接成功 4.选择yes,检查项目 5.如果有下一步,直接next下去就可以了.
- Android之styles.xml,以及自定义风格
1.styles.xml 在现在的ADT创建的Project中,会有values,values-v11和values-v14三个文件夹,每个文件夹下都有一个styles.xml. API11是Andr ...
- 4.oracle正确卸载步骤
oracle 11g如何完全卸载 方法/步骤1: 停用oracle服务:进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止 方法/步骤2: 在开始菜单中,找到oracle-> ...