自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(99)
  • 资源 (3)
  • 收藏
  • 关注

原创 sicily 4424

题目链接:sicily 4424解题思路: 先找到符合lucky number位数要求最小的数,然后枚举所有可能性,最小的符合要求的数即为答案。枚举方法使用全排列的next_permutation算法思想,生成全排列中下一个数。代码:// Problem#: 4424// Submission#: 4734859// The source code is licensed under Crea

2016-05-28 16:07:18 663

原创 Tarjan三大算法之强连通分量

简介: 在之前的两篇博客中,我们详细介绍了Tarjan大牛发明的用来求解割点、桥和双连通分量的算法,这次我们介绍一下强连通分量。算法: 这次的Tarjan算法,可以用一次DFS把所有强连通分量找出来,依旧是用两个时间戳和栈来实现。算法的大体思路还是在深搜过程中更新时间戳,并将遍历过的结点保存在栈中,之后通过对时间戳的判断,来发现强连通分量。当我们完成对一个结点u以及其子孙的访问后,我们可以进行一

2016-05-07 22:21:41 1817

原创 最小瓶颈路与次小生成树

简介: 最小生成树是图论里面一类经典问题,可以有很多种变形,其中最小瓶颈路和次小生成树就是两种比较经典的变形。最小瓶颈路就是在两个结点之间求一条最长边最短的路径,而次小生成树则是所有生成树中权值排名第二的生成树(可以和最小生成树相等)。下面我们分别来看看这两个问题。最小瓶颈路: 给定一个加权无向图,并给定无向图中两个结点u和v,求u到v的一条路径,使得路径上边的最大权值最小。这个问题可以稍微加强

2016-05-06 14:00:41 7911

原创 UVALIVE 4452(2-SAT变形)

题目链接:UVALIVE 4452解题思路: 题意大概这样,n个人对m个方案进行投票,每个人最多对m个方案中的4个投票,要么支持,要么反对,问是否存在一个最终决定,能够让每个投票人都有一半以上的建议被采纳。这题的题意有一个比较不清晰的地方,就是什么叫超过一半,其实就是投1个或2个方案的时候,全部建议都被采纳;投3个或4个方案时,最多一个建议没有被采纳。输出要求先判断是否存在满足要求的最终决定,在能

2016-05-04 20:10:00 813

原创 UVA 10972(边双连通分量)

题目链接:UVA 10972解题思路: 这题的题意很简单,就是给一个无向图,然后要求我们把所有的边都变成有向边,然后再另外添加一些有向边,最终用最少的边把有向图变成强连通的。一眼看过去是懵比的,然而仔细一想,转化后的有向图强连通即原图边双连通啊,于是题目转化成添加最少的边把原图变成边双连通图。先跑一遍Tarjan算法后缩点统计度为0和1的结点即可。代码:#include <vector>#inc

2016-05-03 23:19:51 1096

原创 Tarjan三大算法之双连通分量(双连通分量)

定义: 对于一个连通图,如果任意两点至少存在两条点不重复路径,则称这个图为点双连通的(简称双连通);如果任意两点至少存在两条边不重复路径,则称该图为边双连通的。点双连通图的定义等价于任意两条边都同在一个简单环中,而边双连通图的定义等价于任意一条边至少在一个简单环中。对一个无向图,点双连通的极大子图称为点双连通分量(简称双连通分量),边双连通的极大子图称为边双连通分量。这篇博客就是总结一下求解无向图

2016-05-03 16:18:43 21607 10

原创 sicily 1047(数学)

题目链接:sicily 1047解题思路: 题意很简单,即需要把一串连续的不超过25个的整数分成A、B两部分,分别相加得到两个数sumA、sumB,使得a+sumA=b+sumB。 一眼看过是感觉是0-1背包,但是其实不太一样,因为所有的整数是连续的,所以可以有更方便的方法解决。 假设第一个数为low,最后一个数为high,我们可以得到如下定理: 当A部分有 i 个数时,当且仅当(low+l

2016-05-01 16:04:48 611

原创 Tarjan三大算法之双连通分量(割点,桥)

Robert Endre Tarjan是一个美国计算机学家,他传奇的一生中发明了无数算法,统称为Tarjan算法。其中最著名的有三个,分别用来求解 1) 无向图的双连通分量 2) 有向图的强连通分量 3) 最近公共祖先问题 接下来几篇博客将分别讲述三个算法,首先是无向图的双连通分量,我们先从无向图的割点和桥讲起。下面介绍中无向图中割点和桥的概念: 割点:一个结点称为割点(或者割顶)当

2016-04-23 11:25:35 11351 4

原创 UVALIVE 3523(双连通分量+二分图染色)

题目链接:UVALIVE 3523解题思路: 这题是一道神题,考察的内容非常综合! 这题最终转化为求解图中结点是在一个奇圈上。首先我们可以把所有的圈找出来,即找到所有的双连通分量,跑一边tarjan算法即可。之后重头戏来了,我们获得一个双连通块之后,怎么判断块中的点是不是在一个奇圈上?答案——二分图染色! 定理:一个图为二分图的充分必要条件是图中不存在奇圈。 因此,如果一个双连通块为二分图,

2016-04-08 10:21:21 1040 2

原创 UVA 11478(差分约束系统)

题目链接:UVA 11478解题思路: 题目要求使所有的边权值为正且尽量大,可以很自然地想到最大值最大化的经典解法——二分法。我们需要二分地去寻找答案,判断答案是否合理可以通过构建差分约束系统解决。 我们假设在第 i 个点上进行的权值操作为sum[i],那么所有 i 的出边都增加sum[i],入边都减少sum[i],因为每条边本身有权值,我们要满足权值增减之后所有边权为正,即满足等式sum[i]

2016-04-07 18:04:02 968

原创 匹配极其相关问题(四)

前言: 之前已经介绍了最小点覆盖与最大点独立,那么接下来就应该是最小边覆盖问题了。最小边覆盖问题有很多变种,其中最常见的就是DAG上的最小路径覆盖,这种问题可以转化成二分图最大匹配解决。基本定理: 根据博客(一),有定理如下: 定理4:二分图中,无孤立点,点独立数=边覆盖数=N-边独立数 若存在M个孤立点,上述定理3、4在顶点数N扣除M后成立。 定理7:无向图中,无孤立点, 1)若

2016-04-06 23:21:56 514

原创 匹配及其相关问题(三)

前言: 第二篇博客介绍了匈牙利算法解二分图最大匹配,这次我们需要应用这个算法来解决最小点覆盖与最大点独立问题。基本定理: 根据博客(一),我们有以下定理: 定理3:二分图中,无孤立点,点覆盖数=边独立数(匹配数) 定理8:无向图中,无孤立点,最小点覆盖集与最大点独立集互补 我们这次需要使用这两个定理来解决最小点覆盖与最大点独立问题。算法思路: 根据定理3,我们有点覆盖数等于匹配数,那么

2016-04-05 22:24:08 540

原创 匹配极其相关问题(一)

简介: 匹配问题是图论中一类非常经典的问题,最经典、常见的有二分图最大匹配和二分图最大权匹配,分别可以使用匈牙利算法与KM算法较高效解决。另外,匹配问题通常与支配集、覆盖集、独立集相关联,我们可以通过转化问题,将这些问题转化成匹配问题后套用算法解决。下面先介绍一些基本概念。基本概念: 匹配问题通常与支配集、覆盖集、独立集等问题相关,下面分别介绍五个基本概念。 1、点支配集: 对无向图G=(V

2016-04-05 11:09:13 796

原创 UVA 11090(SPFA判负环)

题目链接:UVA 11090解题思路: 这题需要使用二分法来解决,思路类似与最大值最小化问题,我们可以把求解最小均值环的问题转化成判断负环的问题。二分的过程中,我们可以每次猜想一个最小值,然后使所有的边的权值减去这个最小值,若存在负环,则这个值太大了,最小值需要减小,否则增加。判断负环可以使用Bellman-Ford算法的优化算法,SPFA算法解决。代码设计: 因为最小均值可以为浮点数,而且只需

2016-04-04 14:02:40 887

原创 UVA 10537(最短路)

题目链接:UVA 10537解题思路: 这题是大白书上的最短路例题,应用情景非常经典。首先我们在计算最短路的时候需要从终点算起,因为图中边的权值是变化的;计算的方法是一个坑,大概就是对于一个整数N,求一个整数M,使得N=M−⌈M/20⌉N=M-\lceil M/20\rceil式子是这样的M=⌈19N/20⌉M=\lceil 19N / 20 \rceil,公式的得出需要先考虑M可以被20整除的情

2016-04-03 21:47:27 1274

原创 LightOJ 1422(区间DP)

题目链接:LightOJ 1422解题思路: 其实一眼看过去根本没想到是DP,而是画了一个连线图,即两个相同数字之间连一条直线,要求的其实是一个最长不交错序列。后来想到了一种对称的情况,例如样例为”5 1 2 3 2 1”,这样就没解了。但是也因为想到了这种情况,提醒了我这是一道区间DP的题目,于是解法就很简单啦。代码:#include <cstdio>#include <cstring>#i

2016-03-28 11:43:51 675

原创 UVALIVE 3516(DP)

题目链接:UVALIVE 3516解题思路: 大白书上题目,思路当然是枚举所有情况,实现即记忆化搜索或者动态规划。具体的做法就是枚举根结点最左边的结点,右边的所有结点情况随意,递归调用即可。dp[i][j]表示以S[i]根结点的多叉树的情况代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>

2016-03-25 23:24:45 652

原创 数论之原根

简介: 原根是数论中一个非常重要的概念,它在密码学中有着很广泛的应用。原根从直观上非常好理解,数g对与p是原根,则(g^i)%p的结果互不相同,其中,i ∈ [1, p-1], g ∈ [2, p-1]。原根与整数的阶的关系非常密切,下面先从整数的阶讲起。

2016-03-15 14:43:05 7792

原创 UVA 11021(概率DP)

题目链接:UVA 11021解题思路:这题算是一道很经典的概率入门题了吧,不过首先得知道可以用pow函数。虽然题目中讲的是K个毛球,但是其实可以考虑一个毛球的情况,之后作K次方即为答案。

2016-03-07 15:57:21 529

原创 差分约束系统(入门)

简介: 如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则其为差分约束系统(system of difference constraints)。亦即,差分约束系统是关于一组变量的特殊不等式组。求解差分约束系统,可以转化成图论的单源最短路径问题。 观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w

2016-03-04 12:08:06 715

原创 UVALIVE 2678

题目链接:UVALIVE 2678解题思路: 这题一共有两种做法,一种是二分法,时间复杂度为O( n*log(n) );一种是直接遍历,时间复杂度为O( n )。 二分: 维护一个sum数组,保存数列前 i 项和,之后对每一个大于m的sum[i],使用二分查找找到sum[i]-m的lowerbound。 遍历: 同样维护sum数组,并且维护两个指针,表示满足条件的区间,之后在遍历数组的过程

2016-03-03 10:13:53 630

原创 URAL 1113(数学)

题目链接:URAL 1113解题思路: 这道题目其实是一类经典题目来着,是一道极限问题,即穿越沙漠问题,这种题目都是求在油箱容量受限的前提下,车辆如何走一段比较长的路的问题。一开始想没有想出来,后来看到这篇博客,就懂了。 这题为了使耗油量最小,很显然需要让车走最少的路程,因此必须每次启程,都能让油箱填满。所以可以使用倒推法进行求解,从最后一个油站开始,前一个油站总是要比后一个油站多储存等同于油箱

2016-03-01 08:54:09 652

原创 POJ 2096(概率DP)

题目链接:POJ 2096解题思路: 总的来说状态方程还是蛮好想的,每次找bug的时候,有可能会出现四种情况,一是在已经找到bug的系统中找到了旧bug,二是在新的系统中找到旧bug,三是在已经找到bug的系统中找到了新bug,二是在新的系统中找到新bug。于是,状态dp[i][j]表示在 j 个系统中找到 i 个bug需要的天数期望,初始状态dp[0][0]=0,状态转移方程如下:dp[i][j

2016-02-24 16:48:31 539

原创 强连通分量的tarjan算法应用(一)

题目链接:POJ 2186解题思路: 先用tarjan算法求出图中的强连通分量,再求出缩点后唯一的叶结点即可。代码:#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,dfn[100005],low[100

2016-02-23 16:24:29 809

原创 POJ 2195(二分图最大权匹配)

题目链接:POJ 2195解题思路: 这题可以转化成权匹配或者费用流问题。首先需要根据输入构图,将问题转成权匹配问题,之后套用KM算法即可。KM算法入门很好的一道题目。代码:#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define INF 0x3f3f

2016-02-21 21:13:31 833

原创 POJ 1094(拓扑排序)

题目链接:POJ 1094解题思路: 基本的思路就是拓扑排序算法。需要注意的是环的判断优先于排序是否唯一的判断。代码:#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,a[30][30],degree[30

2016-02-14 00:59:46 655

原创 URAL 1326(状态压缩DP)

题目链接:URAL 1326解题思路: 状态压缩DP,也就是集合的DP,思路跟TSP问题很相似。需要注意的就是可以买多T^T代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;const int MAXN

2016-02-03 23:41:25 653

原创 HDU_1576(乘法逆元)

题目链接:HDU_1576题目说明: 乘法逆元的应用,测一发模板(用模线性方程做的)代码:#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;long long extend_gcd(long long a,long lo

2016-01-01 12:25:58 557

原创 匹配及其相关问题(二)

前言: 很久之前学的一个算法,然而昨天发现我已经完全不记得原理了。上周末去打补选赛,看到一堆时间复杂度没救的图论题,心灵受到了成吨的伤害。老师说算法设计要考网络流,如果不学学二分图匹配的话估计又要GG了。简介: 匈牙利算法,由匈牙利数学家Edmonds与1965年提出,属于比较早期的一个算法。算法的核心在于寻找增广路径,是一种用增广路径求解二分图最大匹配的算法。情景说明: 我们首先给出问题的具

2015-12-31 21:22:02 920

原创 统计回文子序列(动态规划)

dp[i][j]代表区间[ i , j ]中回文子序列的个数……#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MOD 100007using namespace std;char st[1005];int a[1005],dp[1005][1005];int main()

2015-12-31 16:46:41 1120

原创 CSU_1216(异或最大值)

题目链接:CSU_1216题目简述: 经典题目,求一个数组中两个数异或运算的最大值。题目极其简单,但是要求的复杂度需要达到O(N * log(N)),还是比较难的。解题思路: 总的思路就是构建一棵0-1字典树,然后一个数让查找一个与其异或结果最大的数的效率达到O(log(N)),这里因为异或的特殊性质,可以使用贪心法则来实现。 1、0-1字典树: 这里其实是就是二叉树,之所以叫做字典树是因为

2015-12-20 23:19:56 9137

原创 动态规划学习系列——数位DP(练手四)

题目链接:hihoCoder 1033解题思路: 思路超级简单,就是单纯的数位DP,但是,还是觉得好恶心。需要特殊考虑的就是第一位数字为0的情况,不能直接把状态转移的结果拿出来。 状态:dp[i][j][k+100],i 位数中以 j 开头的数交叉和为k的数量

2015-11-28 09:30:21 469

原创 数论之欧拉函数

定义:欧拉函数φ(n),表示小于或等于n的数中与n互质的数的数目。 性质: 1) φ(1) = 1 2) 若n是质数p的k次幂,φ(n) = (p - 1)^(k - 1) 3) 若m, n互质,φ(m*n) = φ(m) * φ(n)

2015-11-06 22:51:05 1158

原创 威佐夫博弈(介绍)

题目大意: 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子,游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者,现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。 这就是著名的威佐夫博弈,这里列出几种先手必败的局势,(1,2),(3,5),(4,7),

2015-11-01 20:00:03 584

原创 素数筛法

平常的素数求法太慢了,所以需要加一下速。第一种,筛法的最基本做法,但是效率不是很高:bool prime[MAXN+5];int ans[MAXN+5],cnt;void getPrimeSlower(int n){ memset(prime,1,sizeof(prime)); cnt=0, prime[0]=prime[1]=0; for(int i=2;i<=n;i+

2015-10-31 12:07:37 594

原创 UVA 11300(数学)

题目链接:UVA 11300 (on vjudge)解题思路: 首先要使用递推推出每个人给了前一个人多少金币的公式,然后将问题转化成求数列中位数的问题(数轴上找一个到所有点距离和最小的点,这个点就在中位数的位置)代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespac

2015-10-26 13:11:58 414

原创 CodeForces 302E(好题)

这题的意思是叫你按照题目要求的指令格式,给出一个指令集,能够把一个小于10^25的正整数 a 变成 a+1。这些指令全都是字符串处理指令,格式为"Si>>Wi"或者"Si<>Wi",其中Si与Wi是字符串,"<>"型指令表示终止,">>"型则可以继续,两种指令执行时,都是在正整数a的十进制表示的字符串中寻找第一个子串Si,Si替换成Wi。Si与Wi可为空,而且只包含数字或者"?"。指令的执行是迭代型的,即如果Si是n

2015-10-03 11:34:11 557

原创 CodeForces 302C(数学)

操作要求是选n个数,改变它们的符号,使得所有数的和最大。n为奇数时,翻转几个数都是可行的;n为偶数时,只能翻转偶数个数,所以我们要留一个绝对值最小的数为负数。

2015-10-01 00:13:47 411

原创 URAL 1104(数论)

题目链接:URAL 1104解题思路: 思路就是简单的模运算规则:( a * b ) % c = ( ( a % c ) * (b % c ) ) % c 根据上述规则,有如下规律:( a * b^n ) % ( b - 1 ) = a % ( b - 1 ) 所以只要所有位上数字之和为b-1的倍数即可。代码:#include <cstdio>#include <cstring>#incl

2015-09-28 22:42:02 485

原创 编辑距离算法——动态规划

概念解释: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同,所以一般会用来表示两个字符串的相似度。允许的操作包括修改一个字符,插入一个字符,删除一个字符。应用范围非常广泛,例如抄袭检测,NLP。 要想知道从一个字符串转成另一个字符串的最少变换次数,我们就需要用一个算法,来求出两个字符串之间的最小编辑距离,...

2015-09-22 18:05:56 1145

pintos_project1

斯坦福大学pintos操作系统,Thread部分,通过27个tests

2015-06-08

CPU_hazard

SMIE计算机组成原理课程五级流水线hazard处理,通过5个tests

2015-06-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除