
ACM-ICPC算法
在参加ACM-ICPC算法时接触到的算法
Maybemust
喜欢有意思的东西~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
BFS走迷宫
第一篇先来写写关于广度优先搜索的东西,由于“涉世未深”,理解难免有偏差,还望指正。/*以下程序实现简单走迷宫注意:1.起始坐标为(1,1),终点坐标为(deep,bro);2.0表示通畅,1表示不通;3.没有考虑无法走出去的情况*/#include <iostream>#include <cmath>#include <cstring>using namespace std;#原创 2017-03-18 23:37:29 · 591 阅读 · 0 评论 -
Dancing link x(DLX)算法 模板讲解
Dancing link 是解决覆盖类问题的一种高效的方法。 具体的讲解可以参考一篇文章http://www.cnblogs.com/grenet/p/3145800.html,这篇文章图文并茂地讲述了算法思想和步骤,十分推荐。 为了方便理解,放一道模板题: Exact cover There is an N*M matrix with only 0s and 1s, (1 <= N,M原创 2017-07-26 21:21:25 · 969 阅读 · 0 评论 -
优先队列优化Dijkstra算法
普通的Dijkstra算法复杂度为n平方,当数据量稍大时就会超时,所以诞生了时间复杂度为nlogn的优先队列优化的Dijkstra算法。 原来版本有大量时间浪费在通过邻接矩阵找边和搜索当前最短路径中,而优化后的算法中,用结构体Edge存储边信息,省却了找有效边的麻烦。而且采用优先队列,可以快速找到最短路径,又省却一部分时间,所以在时间上具有极强的优越性。 贴一份代码,看输入部分代码相信应该可以看原创 2017-08-19 21:18:20 · 4018 阅读 · 0 评论 -
并查集初步
并查集本质上是对集合的操作,即通过标记、连接把元素分为不同集合 它的强大之处在于通过简单标记父节点就能把不同元素归结到固定的几个根节点,通过回溯根节点,就能判断两元素是否同属于一个集合。 当然,在处理的时候,也会出现将整个集合并入另一个集合的情况,此时只要将被并入集合的根的父节点链接到接收集合的根上即可。 放一道例题,帮助理解: The Suspects Severe acute respi原创 2017-07-28 21:49:35 · 264 阅读 · 0 评论 -
带权二分匹配——KM算法
上一篇中,我们讲到如果不带有权值,单纯寻找最大匹配数的话,匈牙利算法完全可以满足,可是,许多问题中,通过带权值我们可以找到最大或者最小化策略,这样的问题,我们就要用到KM算法。先贴一道模板题: 奔小康赚大钱 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。 这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如原创 2017-08-16 21:23:04 · 807 阅读 · 0 评论 -
无权二分匹配——匈牙利算法
首先先明确几个概念: 二分匹配就是两个点的集合,想象成两根筷子一样,左边一列,右边一列,形如这种形式就是二分图; 另外,什么是匹配呢?简单来说,就是从左边找一个点,再从右边找一个点,与这两个点相连的点只有彼此(1对1); 最大匹配问题就是最多能找出来多少对这样的边; 另外,据我的理解(不一定对),网上说的利用交错边寻找增广路等等之所以那样要求也是为了保证同一个点只连接另外一个集合中的一个点—原创 2017-08-16 20:51:48 · 401 阅读 · 0 评论 -
网络流之最大流算法——EK算法(通俗讲解)
先放道模板题来说明网络流: Power Network A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied with an amount s(u) >= 0 of pow原创 2017-08-18 18:23:05 · 1654 阅读 · 0 评论 -
免费馅饼题解
免费馅饼 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神原创 2017-08-18 20:15:37 · 666 阅读 · 0 评论 -
极简的dp代码
设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。输入描述 Input Description输入的第一行为一个整数原创 2017-05-04 00:26:11 · 594 阅读 · 0 评论 -
字符串匹配——KMP算法
先附上一份我觉得解释很详细的文章: 匹配基本流程和前后缀 next数组求法与解释 KMP算法之所以是线性复杂度,就在于不需要重复匹配对比,通过next调到最近的有必要匹配检查的位置。 换句话说,就是对于被匹配串,每当在当前节点发生不匹配,为了不浪费之前匹配成果和避免遗漏,跳到拥有相同前缀的位置继续比较。 不懂?不要紧,看着下面代码注释,相信会有新的发现。 奉上一道水题: 剪花布条原创 2017-08-21 21:12:50 · 236 阅读 · 0 评论 -
AC自动机——讲解
关于AC自动机 AC自动机:Aho-Corasickautomation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。 简单来说,转载 2017-08-22 18:52:38 · 417 阅读 · 0 评论 -
AC自动机完整代码——数组实现,非指针
#include <iostream>#include <cstdio>#include <queue>#include <cstring>using namespace std;struct trie{int next[500010][26],fail[500010],end[500010];int root,L;int newnode(){ for(int i=0;i<转载 2017-08-22 18:53:31 · 708 阅读 · 0 评论 -
AOE算法——超详细,超通俗讲解
AOE算法应用和实现思路讲解可以参见其他数据结构教材或者网上相关博客文章,在这里,我就具体针对代码讲解具体含义: 首先是类头文件:#pragma once#define maxsize 100#define MAX 999999999class graph{public: //活动数量 int possize; //邻接矩阵存储图 int store[maxs原创 2017-08-22 22:42:02 · 4326 阅读 · 0 评论 -
通俗tarjan算法讲解
全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单!tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是任督二脉通不通。。的问题。转载 2017-08-23 11:09:32 · 545 阅读 · 0 评论 -
RMQ问题——ST算法通俗讲解
概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),转载 2017-08-24 17:13:50 · 377 阅读 · 0 评论 -
最小生成树
先说下最小生成树的定义:给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小(在所有连通图中权值之和最小),则称有这n个顶点和n-1条边构成了图的最小生成树 最小生成树有3个性质: (1)最小生成树是树,因此其边数等于定点数减1,且树内一定不会有环; (2)对给定的图G(V,E),其最小生成树可以不唯一,但是其边权之和一定是唯一的; (3)由于最小生成树是无向图原创 2017-07-29 21:33:09 · 699 阅读 · 0 评论 -
线段树1
线段树是一种通过递归方式快速索引处理的方式,但是有大量空间冗余。 先通过一个简单例题说明下: 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营原创 2017-08-06 21:01:26 · 418 阅读 · 0 评论 -
线段树2
上一篇讲到定点更改,可是,线段树最大的作用是对于区间的操作,即对于区间进行整体操作,区间内的每一个值都进行改动,如果直接改的话,会造成数据的大量重复读写,时间消耗高。所以通过进行标记的方式,减少更改次数,降低运行时间。 A Simple Problem with Integers You have N integers, A1, A2, ... , AN. You need to deal wit原创 2017-08-06 21:22:03 · 293 阅读 · 0 评论 -
霍夫曼树(类实现)——超详细解释,超通俗讲解
霍夫曼树常用于最短编码,各类数据结构教材中也都有涉及,核心思想就是每次挑选值最小的树节点,将之合成为一个节点,值为两个之和,取代原来两个,直到只有一个树节点——也就是根。 数据结构很简单,下面附上类实现的代码(编译环境:vs2010)头文件:#pragma onceclass btree{public: struct treenode{ //树节点的数据域 c原创 2017-08-22 19:08:35 · 2430 阅读 · 0 评论 -
使用遗传算法求解TSP问题
从网上找了一个GA算法的模板,按照自己的理解重写了部分操作。附上注释粘贴如下:/** * */package ga;/** * @author ly * */import java.io.IOException;import java.util.Arrays;import java.util.Random;/** * * GA algorithm to sol...原创 2019-01-21 09:25:26 · 564 阅读 · 0 评论 -
无损编码——算术编码
最近随手写了下算术编码,放在这里权当记录。使用了类封装——ArithmeticCodingArithmeticCoding.h#pragma once#include <iostream>using namespace std;#define M 100#define N 128class ArithmeticCoding{public: int count, le...原创 2018-12-10 19:25:19 · 3167 阅读 · 0 评论 -
Djikstra算法
这一专题讲解最短路算法,最短路算法顾名思义就是求解两点之间的最短路径,在数据结构中出现过,常用的有Djikstra和Floyed算法,本文先介绍Djikstra算法。同样,为了帮助理解,先放一道模板题:Til the Cows Come HomeBessie is out in the field and wants to get back to the barn to get as much原创 2017-07-27 21:07:57 · 1671 阅读 · 0 评论 -
Floyed算法
这一讲简单介绍一下Floyed算法。 话不多说,先放一道题帮助理解(其实是懒得描述具体应用场景)。 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit原创 2017-07-27 21:39:17 · 910 阅读 · 0 评论