随笔分类 -  POJ

摘要:强连通分量 + 最短路题意:城市间通信,给出n,n个城市,m,m条边,分别是端点和权,如果两个城市属于同一个国家,那么他们的通信时间为0,否则则按边权算一次的通信时间。两个城市被认为在一个国家,是从A能到B,从B也能到A。下面给出K个查询,能从u到v传递信息,需要多少时间,如果从u无法传递到v,输出那个长长的英文句子其实就是一个最短路,但是最短路的边权有讲究,虽然给出了u,v,w,但是u和v可能是同一个国家的,那么w应该是0而不是原来的值,所以要怎么判断u和v是不是在同一个国家,也就是他们可以互达,很明显不能查询一次判断一次,而是应该先搞出强连通分量,属于同一个强连通分量的两点间的边权为0这题 阅读全文
posted @ 2013-05-09 22:27 Titanium 阅读(312) 评论(0) 推荐(0)
摘要:强连通分量 缩点题意:这个题意比较难懂,题意读懂了,转化过来也不容易输入n,表示n个学校(1到n编号),下面n行,分别是对应每个学校的信息。每个学校可以给其他学校共享一些软件接而共享下去,要让所有学校用上软件,需要多少个学校带头共享软件;另外要让每个学校共享的软件都能被其他所有学校用上,那么要在原来的共享计划中,另外加入那些具体的共享呢(例如原来A学校不向B学校共享的,为了达到目的,A学校需要向B学校共享,因而增加了1)首先建立有向图,A向B共享软件,则有向边A--->B所有第1个问题,问的就是要多少次才能遍历完整个有向图,因为有这么多的学校带头共享软件了,沿着路径延伸,可以到达他们子树 阅读全文
posted @ 2013-05-09 20:59 Titanium 阅读(234) 评论(0) 推荐(0)
摘要:推荐技术公众号:不爱睡觉的大猪 线段树 题意:有一个线段,从1到n,下面m个操作,操作分两个类型,以1开头的是查询操作,以2开头的是更新操作 1 w 表示在总区间内查询一个长度为w的可用区间,并且要最靠左,能找到的话返回这个区间的左端点并占用了这个区间,找不到返回0 好像n=10 , 1 3 查到的 阅读全文
posted @ 2013-05-07 19:47 Titanium 阅读(3454) 评论(5) 推荐(5)
摘要:最短路题意:比较懒有点难描述,所以不说了,看Hint可以看懂的本题的巧妙之处是其实无论怎么走,从起点(固定的)走到任何一个点,到达那个点的时候速度都是确定的因为 速度为spa ,a--->b---->c , b点速度为 spb = spa * 2^(ha-hb) , c点速度为 spc = spb * 2^(hb - hc)式子一合并,就是 spc = spa * 2^(ha - hc) ,可见从点a走到点c,无论中间经过什么点,最后计算速度,之和点a和点c的高度差有关,当然和点a的速度也有关而起点是固定的(1,1),而起始速度是知道的,那么从点(1,1)走到任何一个点时的速度也就 阅读全文
posted @ 2013-05-06 22:37 Titanium 阅读(507) 评论(0) 推荐(0)
摘要:最短路题意:给n个点从1到n标号,下面一行是每个点的权,另外给出m条边,下面是每条边的信息,两个端点+权值,边是无向边。你的任务是选出一些边,使这个图变成一棵树。这棵树的花费是这样算的,1号固定为树根,树中每个双亲节点下面的边都有个单价(即边权),然后单价乘上这条边的下面所有的子孙后代的点权和(看sample2,只要除掉边 1 5 9 按照这个方法就能算出1210)分析:把sample2用式子列一下就能发现,每个点的权都要乘上好几条边的权,是哪几条边呢,就是这个点回到点1的路径上的那些边所以最后的树的花费可以写成 res = sum{ (点权) * (该点回到点1的路径的边权和) } ,这些点 阅读全文
posted @ 2013-05-06 19:35 Titanium 阅读(1250) 评论(0) 推荐(0)
摘要:继续复习Dij变形,可用DP题意:求点1到点n,最大的载重量。转化为 ,1到n有多条路径,每条路径都有一个最小的边,求这些最小的边中的最大值定义d[v] 表示到点v的最小边最大值 , 从u到v,边权为w,那么首先选出 temp = min( d[u] , w) , d[v] = max(d[v] , temp)这是显然的,由u到v,边权为w,要经过这条边,必须流量不能比w大,否则流不过溜过去之后,选最大的用优先队列+dij变形来做,改变的只是松弛的条件而这中问题,用dp来解也是显而易见的,不写了,以前写过#include <cstdio>#include <cstring&g 阅读全文
posted @ 2013-05-05 23:08 Titanium 阅读(265) 评论(0) 推荐(0)
摘要:最短路题意: 强调是有向图 , n个点(1到n标号)m条边,求出点1到所有点的最短路之和 + 所有点到点1的最短路之和什么?求一次最短路,然后 x 2 就是答案? 这样是错的,如果是无向图的话可以这样,因为可以逆回去走。但是有向图显然不是,点1到点a的最短路,和点a到点1的最短路是完全不同的,值不同走过的路径也不同.要求点1到所有点的最短路,直接运行一次最短路即可。但是要求所有点到点1的最短路,难道要对所有点运行一次最短路吗?一看点数就可以否定这个想法。可以这样想,如果点a到点1存在最短路,那么把这条路径的边全部取反,就是点1到点a的最短路了。所有在求了第1次最短路后,将 整个图的边取反,再求 阅读全文
posted @ 2013-05-04 22:38 Titanium 阅读(1132) 评论(0) 推荐(0)
摘要:继续复习DP,图论题意:有向图,n个点,m条边,t个查询。从点u到点v可能有多条路径,找出一条,使这条路径的权值最大的那条边的值在所有路径中是最小的,即最大值最小状态转移方程:dp[i][j]表示从i到j的最小的最大值。dp[i][j] = min{ dp[i][j] , max(dp[i][k] , dp[k][j]) }#include <cstdio>#include <cstring>#define N 310#define INF 0x3f3f3f3f#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ( 阅读全文
posted @ 2013-05-04 09:00 Titanium 阅读(198) 评论(0) 推荐(0)
摘要:dp,图论题意:输入n和m表示n个牛(从1到n标号),下面m个信息,A B,表示A牛能打赢B牛。现在要给所有的牛排名(按实力从高到低),问哪些牛的排名是可以确定的如果知道由l个人能打赢自己,自己能打赢w个人,且l+w+1 = n的话,那么自己的排名就是可以确定的,所有转化为要求出,每个人,能打赢多少人,能被多少人打赢建图: dp[i][j]=1表示i能打赢j,=0表示不确定他们之间的关系,然后类似floyd那样dp,若dp[i][k]=1且dp[k][j]=1,则dp[i][j]=1dp结束后扫描一次整个dp数组即可被归为中等题,这不是水题么。。。。#include <cstdio> 阅读全文
posted @ 2013-05-03 23:25 Titanium 阅读(417) 评论(0) 推荐(0)
摘要:差束约分有人将这题归为最短路的中等题,所以做一下,但是发现其实是裸的差束约分题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果m行信息,所以得到m个不等式 : XB - XA <= C , 所有不等式加起来就是一个差束约分系统对应最短路模型,一开始是 d[v] >= d[u]+w (有向边u--->v) , 在进行完最短路后则变为 d[v] <= d[u] + w ,转化为 d[v] - d[u] <= w这个和上面的 XB - XA <= C 是相同的模式 , 因此建图的时候有向边 阅读全文
posted @ 2013-04-30 00:17 Titanium 阅读(1037) 评论(0) 推荐(0)
摘要:最短路变形题意:你有K个点数,有N个点,M条边,边为有向边,包含4个信息,两个端点+边长+走这条边需要付出的点数。你的任务是,从1号点出发走到n号点,在点数够用的情况下,走出一条最短路,单case显然是一个最短路的变形,而且是一种常见的模型。最短路本身是一个求解最优解的问题,在这里加多了一个限制条件,就是点数,所以变为“在一定的限制条件下求解一个最优化问题”的模型,这样的模型,可以由一个大致的套路,就是,在满足限制条件后,再进行更新下面将讲3个方法,前两个其实都是BFS,第3个事DFS,是一个记忆化搜索。我们先说BFS1.优先队列+dij(最快) 判断一个元素能否入队,不再是看它的最短路估计值 阅读全文
posted @ 2013-04-28 23:20 Titanium 阅读(2948) 评论(0) 推荐(0)
摘要:树状数组题意:一个树,以树枝连接两个点的形式给出,固定以1为整棵树的根。苹果长在树的节点上,节点上只可能0或1个苹果,一开始每个节点都有1个苹果有两种操作,C表示更改某个节点的苹果数,0变1,1变0。Q表示查询,某个节点(包括)的子树上一共有多少个苹果这题是选拔赛时候的题,一看,单点修改,区间查询?线段树?后来一直没想出来,今天看解题报告才明白真的是,不过是树状数组(不过按照理论来将,凡是树状数组能解决的问题,线段树都可以解决,反之不然)。整个问题最难的时候怎么映射成树状数组,映射后,只是树状数组的模板操作1.首先数据太大,不用显式建树,只是用vector来保存边的信息,仅仅是利用vector 阅读全文
posted @ 2013-04-04 22:22 Titanium 阅读(230) 评论(0) 推荐(0)
摘要:暴力+模拟题意:一行字符串没有空格,是一个加法或减法算术表达式。数字中有大写字母,大写字母代表了某个数字,一个字母只能代表1种数字,不同字母代表的数字不同,另外允许存在前导0,另外字母总数最多10个。另外题目中说第1个数字要大于等于第2个数字,所以我做了判断,然后wa了一个早上+一个晚上,注释掉就AC了很无语。。。。另外答案可能有多种,任意一种都可以的,至少我的代码是这样,并且保证是有解的。另外这题网上找不到题解的,确实我也觉得这题很无聊。。。但是选拔赛的时候,居然想成了拓扑排序(因为做过类似的,又一次被驴舔了)说说做法吧因为字母最多十个,所以就暴力枚举,可想而知枚举量最大是10!,枚举后就把 阅读全文
posted @ 2013-03-28 23:14 Titanium 阅读(286) 评论(0) 推荐(0)
摘要:最大流最小割分析都在代码注释中/*题意:对于一个有向图的最大流,在每条流路中,只能修改一条边,使得修改后,整个网络的最大流可以增大,问有多少条这样的边注意一点,在一条流路中只能修改一条,好像s->1->2->t,假设每条边的容量都是2,那么最大流的流路只有一条,但是这条流路中,要想增大一条边的容量而使整个网络的最大流增加是不行的,一定要把所有边容量都增大,这与题意不符,所以这个case输出是0,表示1条都没有首先我们运行一次最大流,得到最终的残余网络,那么我们怎么找到我们要的割边呢?首先割边一定已经是满流的了,假设我们得到一条满流的边u->v如果源点s可以到达点u,且点 阅读全文
posted @ 2013-03-15 23:53 Titanium 阅读(384) 评论(0) 推荐(0)
摘要:状态压缩DP经典覆盖问题,输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案其中n和m均为奇数的话,矩形面积就是奇数,可知是不可能完全覆盖的。接着我们来看n*m为偶数的情况DP前先处理一下,交换n和m使n较大m较小,这样能减少状态数另外数据中是有重复的,所以开辟一个ans数组来记录每组数据的结果,如果遇到相同的数据则不要计算直接输出答案不用这个ans数组的话也不会超时,这个代码是跑出了950ms,加了这个记录答案的数组时间变为600ms接着就看注释部分的讲解即可/*最上面的为第1行,最下面为第n行从上到下按行DP其中一行的 阅读全文
posted @ 2013-03-14 22:08 Titanium 阅读(4041) 评论(0) 推荐(2)
摘要:状态压缩DP多数也把这题分类在图论中,算是状态压缩在图论中的一个应用题意:有n只牛和m个场,下面n行给出每只牛喜欢去的场的个数,再给出每个场的编号(而且每只牛只能去他们喜欢的场)。然后要你安排好这些牛去他们喜欢的场,一个场只能有一只牛,问有多少种分配方案状态压缩,定义一个m位长的二进制数,从右到左依次代表第1,第2,第3个场,1表示这个场已经被占用,0表示没有。最后我们是要把n个牛都安排进去,那么这个二进制数将有n个1,这些就是我们要的目标状态。显然我们是按照牛的个数进行DP,先放第1只牛,再放第2只……最后放第n只。所以状态转移可以表示为 s'--->s , 其中s‘有k-1个 阅读全文
posted @ 2013-03-13 18:55 Titanium 阅读(343) 评论(0) 推荐(0)
摘要:动态规划1.先考虑在1到n的村长里面放一个邮局的最优解,那么就是把邮局放在最中间的那个村庄处最优(若村庄数为偶数则最中间的村庄有两个哪个都可以)2.当放m个邮局的时候,其他每个邮局相当于有一个控制范围,范围内的村庄离该邮局最近,那么m个邮局会把n个村庄分为m块,我们就是dp每一块,令每一块的值最优,以及加上还没有处理的大块的最优解,则是我们要的答案dp[i][j]表示从1号到i号村庄放j个邮局的最优解方程:dp[i][j]=min{ dp[k-1][j-1]+s[k][i] } s[k][i]表示在k号村庄到i号村庄放1个邮局的最优解,也就是放在最中间记忆化搜索/*dp[i][j]=min{. 阅读全文
posted @ 2013-03-06 15:51 Titanium 阅读(197) 评论(0) 推荐(0)
摘要:动态规划题意:让你猜一个物品的价格,猜低了或者猜高了都会提示你。G,L,表示你有G次机会猜一个数,如果猜错了,G会减少1次,如果你的错误是应该是猜高了,那么L也会少一次(猜低了L不会少)。如果G次机会都用完了,则输;若G次机会还有剩余,而L次机会用完了,这时再猜一个数,若猜高了,那么也输了。让你确定一个数字N,以保证在G,L的条件下,你一定能猜到[1,N]以内的任何一个数1.如果L等于0,也就是说你在猜的过程中,绝对不能猜高,所以你只能从1开始猜,并依次为2,3,4……最大能猜到的数是G,所以N=G,这样才能保证你一定能猜到其中的任何一个数2.L>G,这是个迷惑的情况,其实L比G大是没意 阅读全文
posted @ 2013-03-05 19:05 Titanium 阅读(660) 评论(2) 推荐(0)
摘要:动态规划一开始定义为dp[l1][l2][l3][dd],表示用l1个{},l2个[],l3个(),深度为dd的方案数,后来不行。参考别人后,dp[l1][l2][l3][dd]表示深度小于等于dd的方案数,那么答案是dp[l1][l2][l3][dd]-dp[l1][l2][l3][dd-1]可以用分块和整块的思想来看这个问题好像[[()][]] 这类的我们可以说它是整块,[][](),这类的我们可以说它是分块,我们在构建的dp数组的时候就是把其当做是分块来处理,然后使用乘法原理例如dp[l1][l2][l3][dd],我们可以先构建一个小分块,用小分块的方案数*其实括号能组成的方案数,而这 阅读全文
posted @ 2013-03-03 11:20 Titanium 阅读(628) 评论(0) 推荐(0)
摘要:动态规划也是经典题目,黑书上也有介绍。今晚上JAVA在想,想了一下想出来,需要五维,大矩形的值由小矩形得到,这个状态转移方程个人感觉还是比较想到,但是一些细节的地方还没想到怎么处理,回来瞄一眼黑书得到了标准差的一个转化公式,所以疑团解开,便开始打代码(看黑书过程中它写的状态转移方程和我想的一样,但是有一些细微的细节,我感觉我这样处理比较保险,我后来细想了一下它的,虽然没有判断但是可能也不会出错,但是更倾向于我自己想的那种,就是关于横着切和竖着切的范围)忘记搞掉注释WA了一次,搞掉后就AC了,算是 一次成型不用debug,后来上网找报告,大家几乎都是用double来开数组的,其实不用double 阅读全文
posted @ 2013-02-27 23:41 Titanium 阅读(1787) 评论(0) 推荐(2)