ACM_图论
JayYe
这个作者很懒,什么都没留下…
展开
-
poj 2186 Popular Cows 强连通
题意:有n头牛,某头牛可能会认为另一头牛受欢迎,现在给你m种关系,每种关系A B表示A认为B是受欢迎的,这种受欢迎有传递性,如果A认为B受欢迎,B认为C受欢迎,那么A认为C受欢迎,现在问你被其他所有人认为受欢迎的牛有多少头。对关系图缩点后,其实就是要求出度为0的强连通,如果这样的强连通大于1,那么就没有这样的牛。如果得到的是多个有向无环图,那么也没有这样的牛,其实这种情况已经被包括进来原创 2013-07-31 16:08:14 · 867 阅读 · 0 评论 -
Codeforces Round #143 (Div. 2) (边双联通)
C:给你一个数列,可以给某个数加上1,最多可以加k次,问操作之后相同的数的个数最多是多少。排完序可以二分答案是哪个数,也可以直接枚举维护一个左值,每次判断i到j是否可行。D:这么简单的题居然不是AB题。。E:给你一个无向图,每个点最多只在一个简单环中,问s到t有多少种路径,不能经过同一条边两次,走过的边的集合不同表示路径不同。思路:由于每个点最多只在一个简单环中,所原创 2013-12-05 21:37:04 · 1062 阅读 · 0 评论 -
UVa 1357 Cells (栈模拟dfs LCA)
题意:根据题意描述构建一棵树,树的节点可能达到20000000个,不过只有n (n 解题思路:因为只有n个节点有儿子,所以每次询问x、y时,x必须是有儿子的也就是说x 模拟栈,每次取出栈头元素,但是先不要删掉,遍历该元素的儿子,如果儿子都被访问过了则删除栈头元素,否则加入一个儿子跳出,因为有回溯,其实再一次访问到这个元素就相当于回溯。注意每次加入一个儿子。具体见代码~原创 2013-10-27 17:19:40 · 1295 阅读 · 0 评论 -
HDU 3666 THE MATRIX PROBLEM (差分约束判负环)
题意:给你一个N*M的矩阵C,问是否存在一个长度为N的数列a和长度为M的数列b使得所有C(i,j)*a(i)/b(j)在L , U范围内。解题思路:有两个式子 C(i,j)*a(i)/b(j) >= L , C(i,j)*a(i)/b(j) /* **********************************************Author原创 2013-10-27 13:37:12 · 1145 阅读 · 0 评论 -
UVa 11294 Wedding (two SAT 输出解)
题意:有n对夫妻,要坐在一张长桌子的两侧,夫妻不能坐在同一侧,其中有一个是公主,她不希望看到她对面一侧的人中有奸夫淫妇。。。题中给出若干对有奸情的两个人,可以是异性也可以是同性。。。问你是否存在满足条件的情况,如果存在,则输出和公主同一侧的人。解题思路:two SAT搞起,我用的是刘汝佳的犀利的模板,直接搜环,不用强联通~这个好处就是输出解特方便,不需要强联通缩点加拓扑,好东西原创 2013-10-27 14:29:02 · 1808 阅读 · 0 评论 -
HDU 3667 Transportation (最小费用最大流)
题意:有N个城市M条道路,现在你要把K个物品从城市1转移到城市N,每条道路转移x个物品需要ai *x^2费用,并且每条道路都有转移物品个数的上限,问你转移这K个物品最小费用为多少,若不能转移,输出-1.解题思路:对于每条道路建边每个容量为1的费用分别为ai , 3*ai, 5*ai ... (x^2 - (x-1)^2) *ai ,因为如果流量为1,肯定是走ai这条路,如果流量原创 2013-10-27 10:40:11 · 1159 阅读 · 0 评论 -
UVa 515 King (差分约束系统)
差分约束系统:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi 差分约束可以转化话单源最短路求解。因为单源最短路径满足三角不等式d[v] = 只要改变一下初始化条件即可。 差分约束题目有两种,一种求最大值,另外一种求最小值。 (1)当题目是求满足给定不等式的最小值时,就是求图的最长路。原创 2013-10-07 17:03:21 · 1621 阅读 · 2 评论 -
HDU 3686 Traffic Real Time Query System(点双连通缩点 + LCA)
题意:给你一个无向图,询问边a和边b,问从边a到边b的路径中几个点是必须要经过的。解题思路:很容易想到其实是求路径上割点的个数,然后就可以对图进行缩点了,我是把边缩成一个点(块),因为每条边有且仅属于一个联通块中,然后对割点和它相邻的块建边,新的建边完成后新图就成了一棵树。询问a边和b边,只需要找出它们分别属于哪个块中,问题转化成:一棵树中,有些点标记了是割点,现在询问两个原创 2013-10-05 02:20:29 · 3093 阅读 · 0 评论 -
欧拉回路
欧拉路:图G,若存在一条路,经过G中每条边有且仅有一次,称这路为欧拉路。欧拉回路:图G,若存在一条回路,经过G中每条边有且仅有一次,称这条路为欧拉回路。判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。判断欧拉回路是否存在的方法有原创 2013-10-03 10:38:34 · 1151 阅读 · 0 评论 -
UVa 1423 Guess (拓扑排序)
题意:给你一个数n和一个字符矩阵,矩阵中S(i, j)表示ai + a(i+1) +...aj的正负号,要你还原a序列,其中a序列中每个数的绝对值不大于10.解题思路:把题目转化成已知各个前缀和的大小关系,求每个前缀和的值。s(i, j) 符号为正的话,表示a[i]+a[i+1] +.. a[j] > 0,即前缀和sum[j] - sum[i-1] > 0,即sum[j] >原创 2013-10-01 10:57:34 · 1134 阅读 · 0 评论 -
UVa 二分图匹配 Examples
UVa 二分图匹配 Examples原创 2013-08-18 15:23:08 · 953 阅读 · 0 评论 -
UVa 二分图匹配 Biginners
UVa 二分图匹配 Biginners原创 2013-08-18 19:57:41 · 1580 阅读 · 0 评论 -
poj 3177 Redundant Paths 边双连通
这道题和poj 3352差不多的,只不过有重边,这样的话其实不用管,对所有的边都建边就行了,不过貌似poj的数据很弱,反正对于2 21 22 1这种数据我是输出0的,别人的有输出1的都过了。#include #include const int maxn = 5005;const int maxm = 10005;struct EDGE{ int to, v原创 2013-07-29 12:45:29 · 751 阅读 · 0 评论 -
poj 1236 Network of Schools 强连通分量
题意:给你一个有向图,第一问:增加一个点至少需要加多少边使得该点能到达其他所有点。第二问:至少需要加多少边使得整个图变成一个强连通分量。对于第一问就很简单了,只需要求出缩点后入度为0的点的个数,对于第二问的话,需要求出缩点后入度为0的个数和出度为0的个数,较大值为答案。比如0出度大于0入度,这样把所有0出度的连到不为该节点祖先的其他子树的0入度节点上,画个图应该很明白。原创 2013-07-29 21:27:34 · 882 阅读 · 0 评论 -
poj 3352 Road Construction 边双连通缩点
题意:给你一个图,问至少需要加多少条路使得整个图成为边双连通。求出割边并缩点,可以得到一棵树,统计树上所有度为1的点数,最后的答案就是(cnt+1)/2,这个画个图就明白了。#include #include const int maxn = 1002;const int maxm = 1005;struct EDGE{ int to, next, vis;}原创 2013-07-28 17:00:43 · 809 阅读 · 0 评论 -
poj 1523 SPF 无向图求割点
无向图求割点和块的模板题#include #include const int maxn = 1111;struct EDGE{ int to, next;}edge[maxn<<2];int head[maxn], iscut[maxn], dfn[maxn], low[maxn], subnet[maxn], E, time; void newedge(int原创 2013-07-28 11:22:36 · 1082 阅读 · 2 评论 -
poj 2942 Knights of the Round Table 点双连通
圆桌骑士,记得小时候街机也有同名还蛮喜欢玩的游戏。题意:有n个骑士经常举行圆桌会议,商讨大事~每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置。如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数以防止赞同票和反对票一样多。知道了哪些骑士相互憎恨之后,你的任务是统计有多少个骑士不可能参加任何一个会议。(题意来自刘汝佳白书)首先可以对不原创 2013-07-28 15:21:22 · 876 阅读 · 0 评论 -
Codeforces Round #238 (Div. 1) D题(倍增lca)
题意居然是最终可以到达的点,我居然比赛时看成要同步走同时到一个点,傻逼不能多说。。其实很简单的求个lca就可以了,前面预处理用栈维护下就行。学了倍增法求lca,果然是简单多了啊。。。#include #include #include using namespace std;const int N = 100000+5;struct Edge {原创 2014-03-24 21:48:18 · 944 阅读 · 0 评论