随笔分类 - UVA
摘要:二分法+spfa判负环。如果存在一个环sum(wi)using namespace std;const int maxn = 51;struct Edge{ int v,nxt; double w;};vector edges;int head[maxn];#define PB push...
阅读全文
摘要:从终点逆推,d[u]表示进入u以后剩下的货物,那么进入u之前的货物数量设为y,d[u] = x,那么y-x=ceil(y/20.0)=(y-1)/20+1=(y+19)/20。(y-x)*20+r=y+19,0≤r≤19,即19*y=20*x+r,根据题意y应该尽量小,x的部分是不能变动的,所以y=...
阅读全文
摘要:很多的边会被删掉,需要排除一些干扰进行优化。和UVA - 1279 Asteroid Rangers类似,本题最关键的地方在于,对于一个单源的最短路径来说,如果最短路树上的边没有改变的话,那么最短路肯定是不会变的,所以只要枚举删掉最短路树上的边。这样的时间复杂度就能过了。#includeusing ...
阅读全文
摘要:求出家到其他点的最短路径,题目的条件变成了u->v不是回头路等价于d[u]>d[v]。然后根据这个条件建DAG图,跑dp统计方案数,dp[u] = sum(dp[v])。#includeusing namespace std;const int maxn = 1001, maxm = 2002;st...
阅读全文
摘要:题目只有一条路径会发生改变。常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路。路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用dist数组检查。#includeusing namespace std;const int maxn = ...
阅读全文
摘要:用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案。#includeusing namespace std;const int maxn = 1e5+5;#define PB push_backbool vis[maxn*2];vector G[maxn*2];in...
阅读全文
摘要:题目的要求一个最小值最大,二分即可,但是怎么判断呢?飞机早或者晚两种状态,可以用一个布尔变量表示,假设当前猜测为m,那么根据题意,如果x和y所对应的时间冲突那么就是¬(xΛy)化成或的形式(¬x)V(¬y),就可以套用twoSAT了。关于2-SAT,简单理解是,把逻辑推导变成一条有向边,然后跑图判断...
阅读全文
摘要:给出一个有向图,求一个最大的结点集合,任意两个点u,v。u可到达v或v可到达u。一个强连通分量肯定一起选的。而且只能在一条路径上。所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG上的dp。注意0,0这组数据#includeusing namespace std;const int ...
阅读全文
摘要:把证明的关系看出一张图,最终就是要所有的点都在至少一个环中。环的判断和度数有关。用tarjan找强连通分量,在一个强连通分量点已经等价缩点以后形成一个DAG,计算入度为0的点数a,出度为0的b,取其中大的一个。特判强连通分量数为1的情况。看懂tarjan算法以后还是比较简单的#includeusin...
阅读全文
摘要:补题,逆序考虑每个询问的时间,这样每次就变成出现新岛屿,然后用并查集合并统计。fa = -1表示没出现。以前写过,但是几乎忘了,而且以前写得好丑的,虽然常数比较小,现在重新写练练手。每个单词后面都要加空格不然PE#includeusing namespace std;const int maxn =...
阅读全文
摘要:题意:在一颗树上要求一个到其他结点容量和最大的点,i,j之前的容量定义为i到j的路径上的最小边容量。一开始想过由小到大的去分割边,但是很难实现,其实换个顺序就很容易做了,类似kruskal的一个贪心算法,从大到小的连边,每次连通两个分量A和B,这样可以新边容量一定是两个分量相互到达的最小容量,其余边...
阅读全文
摘要:题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了。。。最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行。这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的自然不能再次调度。不在边界上的边连一条容量为1的边表示至少留一个人,在边界上的与T的连边就设置成mid。...
阅读全文
摘要:这道题挺像hdu 5093 Battle ships的,不过那道题是要求最多放置的点数,而这道题是要求最小点覆盖。顶点覆盖的定义是:在G中任意边至少有一个端点属于顶点集合S。一个重要的位置有(x,y)两个坐标,而要守住这个这个位置就是相当于连了一条边x到y的边。选了一个(x,y)就相当于选了所有相同...
阅读全文
摘要:模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了。所以就是找一个二分图最大匹配。因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行了。也有另外一种写法不用除以2的。#includeusing namespace std;const ...
阅读全文
摘要:最短路问题,不过起点不只是1个,终点也不止1个,因此把不同电梯的楼层分别编号,相邻楼层之间连边,不同电梯的相同楼层之间连边。dij的时候一次性把所有起点压到队列中,如果直接套版可以加一超级源点s和所有起点连一条dist为0的边。需要维护的信息:为了判断之前电梯有没有出现相同楼层,需要维护一个楼层到点...
阅读全文
摘要:题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0。读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候是由底向上的,这步可以在读取的时候顺带完成。注意'X'或'1/x'在某个结点和'0'相乘,那么'X'等...
阅读全文
摘要:题意:求一个无向图的点连通度。把一个点拆成一个入点和一个出点,之间连一条容量为1的有向边,表示能被用一次。最大流求最小割即可。一些细节的东西:1.源点固定,汇点要枚举一遍,因为最小割割断以后会形成连通分量,在分割以后那个连通分量里的割会更大。2.每次枚举重建一下图。3.从入点进,出点出,才认为是经过...
阅读全文
摘要:求所有点直接的平均最短距离,保存一下出现过的点,题目保证是所有点连通,Floyd求出最短路以后两个for统计一下。#includeusing namespace std;const int maxn = 101;int g[maxn][maxn];bool vis[maxn];vector p;co...
阅读全文
摘要:如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径,是完全图,用不加堆优化的dijkstra就行了O(n^2)。#includeusing namespace std...
阅读全文
摘要:题意,有n个匀速动点,求最小生成树的改变次数。一句话总结:动态问题的一般做法是先求出一个静态的解,然后求出解发生改变的事件,事件按照时间排序,依次处理。先求出最开始的最小生成树(MST),当MST中的某条线段v长度被不在MST的线段u取代的时候,最小生成树才会发生变化,具体来说,已经知道之前的MST...
阅读全文

浙公网安备 33010602011771号