==== 图论 =====
「已注销」
这个作者很懒,什么都没留下…
展开
-
Codeforces 766D Mahmoud and a Dictionary(并查集+map)
思路:对于同义词和反义词分别考虑最一般的形式。 即,对于集合x,y和其相应的反义词的集合x+n,y+n,讨论其关系。#include <string.h>#include <iostream>#include <cstdio>#include <queue>#include<algorithm>#include <map>using namespace std;typedef lon原创 2017-10-02 21:24:57 · 281 阅读 · 0 评论 -
HDU 1269 迷宫城堡(tarjan强联通分量)
思路:tarjan求强联通分量个数代码:#include <iostream>#include <cstdio>#include <algorithm>#include <string.h>using namespace std;int ans;//代表着强联通分量的个数//链式前向星const int maxn = 10010;//最大的点的个数int head[maxn];stru原创 2017-04-29 19:04:47 · 261 阅读 · 0 评论 -
POJ 2186 popular cows (tarjan + 缩点)
思路:有向图,边具有传递性。我们要找的是这样的点:这个点被其他所有的点所直接或传递指向,即这个点是所有牛所崇拜的。通过对数据的观察,直接否决了暴力的可能性。因为要暴力传递性,所以至少要 n3n^3 的复杂度。首先我们考虑图中存在的强联通分量,对于强联通分量中的点,每个点都能通过传递性到达此联通分量中的任何一点,即可以将这个强联通分量视为一个点(缩点),而这个点的出边即连向其他的缩点。考虑经原创 2017-04-29 22:26:57 · 85 阅读 · 0 评论 -
HDU 3671 Boonie and Clyde (tarjan+割点变形)
思路:此题不是一般的求割点,而是求去掉一对点之后能否让图分开,即割点对(我这造词能力,满分)对于第一个点我们只能枚举,但是对于第二点却不必暴力枚举考虑经过删减第一个点之后的图,如果删去这个点之后剩下了一个部分,那么我们对这张图tarjan求割点,然后加入结果就好了。如果剩下了2个部分,那么考虑这两个部分中的点的个数,如果两个部分中的点都是1个,那么对结果没有贡献。如果只有一个部分是1个点,那么原创 2017-04-30 14:10:04 · 476 阅读 · 0 评论 -
POJ 3311 Hie with the Pie(Floyd + 状压dp)
思路:AC代码:#include <iostream>#include <cstdio>#include <algorithm>#include <string.h>#include <vector>using namespace std;int n;int dp[(1L<<11)+10][14];int a[22][22];void floyd(){ for(int k =原创 2017-05-02 22:05:51 · 213 阅读 · 0 评论 -
POJ 3621 Sightseeing Cows(最优比率环/01分数规划)
思路:01分数规划的第三题。(前两题分别是poj 2976 2728) 这道题能明显感觉到不适用于迭代法(Dinkelbach) 一开始写的时候本打算用的,然后写的过程中发现记录哪些点组成的环是一件很复杂的事情。而且,spfa的思想也是检测负环 && 最短路。 (其实要想记录的来一个pre【】数组记录修改此节点的前驱节点也可以,只是麻烦。。毕竟spfa已经很长了。。) 注意这里有一个小点:有原创 2017-07-06 13:29:08 · 726 阅读 · 0 评论 -
Hihocoder 1050 树中的最长路(树的直径 两次dfs/折点)
两次dfs:#include <iostream>#include <cstdio>#include <string.h>#include <queue>using namespace std;int vis[101000];int head[101000];int cnt;struct node{ int y; int next;};node e[300000];v原创 2017-01-14 16:17:18 · 240 阅读 · 0 评论 -
poj 3984 迷宫问题(bfs 输出序列)
#include <iostream>#include <cstdio>#include <string.h>#include <queue>using namespace std;int v[10][10];int cnt[10][10];// 记录走到这点的时间int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};struct node{ int x原创 2017-01-14 16:22:12 · 277 阅读 · 0 评论 -
HDU 2612 Find a way (两次bfs)
坑点:进了kfc可以从这个建筑物里出去,四面八方的出那种。。。#include <iostream>#include <cstdio>#include <string.h>#include <queue>using namespace std;int v[300][300];int ans[220][220];int d[4][2] = {{0,-1},{0,1},{1,0},{-1,0}原创 2017-01-15 20:47:26 · 294 阅读 · 0 评论 -
POJ 3522 最大边与最小边差值最小的生成树(最小生成树的性质)
思路:最小生成树的性质:最短边与最长边的间距,即:最长边的权值-最短边的权值 最小 所以对这个题来说,先对所有边的权值排个序,然后分别以其中的一条边作为最短边来进行最小生成树的构造,记录每个最小生成树的结果。注意,剩下的至少要有n-1条边才能构成,所以可以稍稍剪一下枝。#include <iostream>#include <cstdio>#include <string.h>#includ原创 2017-01-17 11:10:40 · 997 阅读 · 0 评论 -
HDU 5874 Friends and Enemies (二分图 读不懂题系列)
题意:给你n个人,他们两两之间是朋友或者敌人,敌人的敌人一定是朋友(这点题里好像没说,然而我觉得很重要的一点条件),每个人都可以带一个由数目不定的石子组成的项链,可以不带(那么这个人将会是所有人的敌人,因此除了他意外每个人都是朋友),给你m个颜色的石头,现在问你,这m个石头是否一定够用?思路:考虑最坏的情况:在是朋友的两个点上连上边,也就是每有一条边就需要多一种颜色,所以尽可能的在不构成三元环的情况原创 2016-09-11 16:07:29 · 343 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼 (分段dijkstra)
思路:有题目可知最终1号一定要在交易链中,所有可以通过1号的等级来划分出一些等级区间。 现在假设1号等级为v,等级区间的差为m,那么我们可以知道最终结果一定在 [v−m,v+m]{ [ v-m,v+m ]} 中,但是不能直接用这个区间去判定,因为这个区间长度大于了m,所以我们从 [v−m,v]{[v-m,v]} 开始,for(int i = 0;i <= m;i++){ [v-m+i,v+原创 2017-02-14 14:19:23 · 227 阅读 · 0 评论 -
POJ 3281 Dining (最大流)
思路:类似与hihocoder的二分图多重匹配。 虚拟源点,源点连食物,食物连牛,牛连对应着的的自己,对应着的牛连水,水连汇点。 边权全部为1. 拆点是为了保证每头牛只通过一条流,即每头牛只吃一份套餐~ 我是这么编号的: 源点:0 食物:1~f 牛:1+f ~n+f 新牛:1+n+f~n+n+f 水:1+n*2+f~d+n*2+f 汇点:2*n+f+d+1ps:接下来就是套板子原创 2017-07-23 14:55:31 · 183 阅读 · 0 评论 -
ZOJ 2760 How Many Shortest Path(floyd + 最大流)
思路:首先用floyd跑出最短路,然后对于每条边判断,dis[j]==dis[i]+<i,j> dis[j] == dis[i]+ <i , j> 满足条件即加到网络中,(i,j,1),求解最大流,即为答案。坑点:注意他给的样例有诈。。 当i等于j的时候需要自己手动置0,而不是指望他给你0。。 靠。因为这个狂wa不止。。#include <iostream>#include <cstdio原创 2017-07-23 16:10:35 · 210 阅读 · 0 评论 -
POJ 3164 Command Network(最小树形图 朱刘算法)
###思路: 最小树形图模板题。 有向图的最小生成数。#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<map>#include<cmath>//#define inf 0x3f3f3f3f#define inf 1e15#define eps 1e-6typedef lon原创 2017-08-15 10:32:45 · 251 阅读 · 0 评论 -
2015-2016 Northwestern European Regional Contest (NWERC 2015) E
题外话:vj上的题交到的网站不知道怎么回事数据都炸了。。。还是去交codeforces把。。 题目链接: http://codeforces.com/gym/101485我是用网络流做的,后来听说官方题解是二分图匹配,不过都一样啦。 s连2500个点(容量为1),然后找2500个点分别去连他们能得到的三种数值,然后对于每种数值,连t(容量为1)。泡一遍最大流,如果不等于n(点的个数),那么无解原创 2017-10-01 18:39:10 · 434 阅读 · 1 评论 -
HDU 6118 度度熊的交易计划(最小费用可行流\费用流)
思路:其实就是个费用流的裸题。。 s=0,t=n+1; 对于每个村庄,addedge(s,i,b[i],a[i])addedge(s,i,b[i],a[i]) 表示增加一条s到i的边,容量为 b[i]b[i] ,花费为 a[i]a[i] 同时 addedge(i,t,d[i],c[i])addedge(i,t,d[i],c[i]) 对于每一条路,容量无限大,费用为距离。自我总结:比赛的时候为什原创 2017-08-15 09:19:01 · 314 阅读 · 0 评论 -
HDU 6080 度度熊保护村庄 (叉积判断点线关系+图论)
思路:暴力枚举度娘的点,判断是否所有的要保护的点都在左边(或者都在右边,一样的)。如果都在左边,那么建一条i到j的边。坑:我到现在也不太明白为啥三点共线也可以。然而本题确实是:保护的点和ij在一条直线上,而且这个点在ij之间,那么这也算保护住了。优化:floyd的时候不优化会t。#include<stdio.h>#include <iostream>#include<string.h>#inc原创 2017-08-12 13:18:04 · 387 阅读 · 0 评论 -
HDU 6126 Give out candies (贼巧妙的最小割)
思路:最小割模型。考虑如何转化成最小割模型。 先不考虑k个限制条件。 我们要求的是每个孩子的最大的满足度,而最小割,割的是最小容量的边,所以我们需要负权建边,然而板子跑不了负的容量啊,所以我们对于每条边加上一个足够大的值F(题目中虽然没给wijw_{ij} 的值,但官方题解中明确了小于1000,所以题面应该是有着问题的。),如下图方式建图,把每个孩子得到的糖数串起来,跑到的最小割的时候割出来的边原创 2017-08-19 11:00:30 · 703 阅读 · 0 评论 -
HDU 6073 Matching In Multiplication(强连通+拓扑)
思路:先找右边节点入度为1的点,设为b,所以这个点练的边一定做出了贡献。然后找左边连这个点b的点a。 将a所连的点的入度都减减,如果出现入度为1的,那么接着从这个点搜。 直到没有这样的点。 所以剩下的点都在环里。 跑一边tarjan,然后在各自的联通分量内跑一圈,注意:环的贡献由两部分组成,因为是选一条边不选一条边,所以反过来就又有一种。#include<stdio.h>#include<原创 2017-08-03 19:38:19 · 219 阅读 · 0 评论 -
POJ 3469 Dual Core CPU(最小割)
题意:给你n个任务,每个任务要不在花费 aia_i 在a核上完成,要不花费 bib_i 在b核上完成。同时有m个约束条件,如果第i个任务和第j个任务在不同的核上完成需要额外的花费。源点s,汇点t。 根据题意建图对于每个任务,s连i,容量为 aia_i 。 i连t,容量为 bib_i 。根据最小割的定义我们可以得到两个集合,一个以s为核心,一个以t为核心。现在考虑我们建的图,每个任务i的两条边中短原创 2017-07-26 16:25:44 · 177 阅读 · 0 评论 -
HDU 6038 Function (强连通+计数)
思路:看似是数学题。。其实是图论。 我们可以发现他给的函数的约束关系其实是一种递推推导。 对于样例 3 2 1 0 2 0 1 我们把a行的第i个(i从0开始)建一条从i到 aia_i 的边,那么对于这个样例我们得到了一个二元环和一个一元环,对b行进行相应的操作,我们得到了两个一元环。(我这里的二元环即代表由两个元素组成的环)这个环是什么意思呢?她代表了一种相互递推的关系,只要在环中的任原创 2017-07-25 21:36:22 · 925 阅读 · 0 评论 -
hihocoder 1398 : 网络流五·最大权闭合子图
正宗题解:http://hihocoder.com/problemset/problem/1398自己的理解:注意理解题目,题目的意思是当选择一个活动时,一定要选择这个活动所指向的学生。 即:如果有多个活动需要同一个学生,那么这个学生只需要被选中就好了,无需考虑被选了几次。 先是按照要求建图,虚拟出源点s汇点t。 对于活动i,直接连s到i,权值为活动的收益。(此点为正权点) 对于学生i,直接原创 2017-07-25 21:02:39 · 279 阅读 · 0 评论 -
HihoCoder 1394 网络流四·最小路径覆盖
思路:思路全在这呢,包括为什么这么建图的原因都说的很明白了。。 http://hihocoder.com/problemset/problem/1394最小路径覆盖:找出最少的路径,使得这些路径经过了所有的点自我总结: 依靠每个店只能有一个前驱结点和一个后继节点的性质,将自己拆分成两个,分别表示节点i(前驱)和节点i(后继),这样就正好可以进行二分图匹配了。刚好符合每个节点入度为1,出度为1的性原创 2017-07-23 17:06:12 · 321 阅读 · 0 评论 -
HDU 1233 还是畅通工程 (最小生成树 Kruskal)
思路:基本的最小生成树模板题。AC代码:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int node[110];int _find(int x){ int xx = x; while(node[xx] != xx){ xx = node[xx];原创 2016-09-15 16:57:36 · 69 阅读 · 0 评论 -
HDU 1879 继续畅通工程(最小生成树 Kruskal)
AC代码:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int node[110];int _find(int x){ int xx = x; while(node[xx] != xx){ xx = node[xx]; } int temp原创 2016-09-15 19:49:36 · 245 阅读 · 0 评论 -
SCU 4444 Travel (完全图 最短路 set )
思路:首先考虑a小于等于b,那么我们只需要跑一边由a边建的图就好了,因为原图是完全图,所以得到的结果和b取最小值就好。 然后考虑a大于b,进行一遍bfs,注意每个点最多计算一次,所以我们可以用两个set集合来标记这个点还能不能用(能用的话用set.count(v)=1来表示),如果此时某个能用的点这次因为有a边而不能用了,那么把这个点放进另一个set:ts,这个集合是下次可以接着用的点。总之卡点是原创 2017-07-30 13:53:48 · 599 阅读 · 0 评论 -
SCU 4439 Vertex Cover (dfs +剪枝 一般图的点覆盖)
思路:这题的数据啊。。根本没有奇数环的吗?怎么那么多人用二分图做的。。 然后我听别人说一般图的点覆盖问题是npc的。。而且自己也构建出奇数环的情况怼烂了自己的二分图。。正解是根据题目的 min(ai,bi)≤30min(a_i,b_i) \leq 30 的条件dfs判断。因为最多也就选30个点。。。 一开始每个点都不选,然后对每个点分选与不选的情况,如果选了这个点,那没什么好说的,直接dfs下一原创 2017-07-30 10:02:10 · 377 阅读 · 0 评论 -
POJ 2749 Building roads (2-SAT)
题意:农场主的牛喜欢串门。。。(又一道奇葩题目。。) 所以农场主得给他的n个牛舍(barn)建造道路,然而农场主觉得花费太多,所以他打算建造两个中转点s1和s2,任意的牛舍要么连s1,要么连s2。 同时还有一些牛舍里的互相讨厌,所以这两个牛舍不能连到同一个中转站。 同时还有一些牛舍里的互相喜欢,所以这两个牛舍要连到同一个中转站。 给你s1和s2的坐标,然后还有n个牛舍的坐标,问你,让牛舍之间原创 2017-07-20 20:52:45 · 246 阅读 · 0 评论 -
POJ 3683 Priest John's Busiest Day (2-SAT 输出路径)
题目大意:一个牧师要去主持婚礼,每对新人夫妻会给你两个时间和一个持续时间,分别为 from to 和value 你可以在from到from+value的时间段里给她们们举行婚礼,也可以在to-value到to的时间段里为她们举行婚礼,但是总是要选一个的。 然后现在给你n对夫妻的。问你能不能有一种可能的方案,如果有,按照输入的顺序,将每对夫妻举行婚礼的时间段输出出来。 第i对夫妻的两个时间段可以原创 2017-07-17 13:21:58 · 227 阅读 · 0 评论 -
POJ 2723 Get Luffy Out (2-SAT)
题意:给你n对钥匙,一共2*n个钥匙。 然后不一定谁和谁配对,但给你这n个配对关系。 一对钥匙里,你只能选一把钥匙。 然后你面前有1扇门,门有两个锁,你只要任意打开一个锁就能进去,然后你面前又有一扇门。。。 给你n扇门各自所需要的锁。现在问你最多你可以过多少扇门。注意配对关系i,j,只能选其中一个,所以这么建边: ae(i,j+n) ae(j,i+n) ae(i+n,j) ae(j+n,i原创 2017-07-20 11:05:53 · 216 阅读 · 0 评论 -
POJ 3648 Wedding (2-SAT 输出路径)
题意:有一对新人要结婚了,所以他们邀请了n对夫妻来参加婚礼。 然后就是喜闻乐见的吃饭情节了,然而在坐座位的时候有要求,桌子有两边,这夫妻不能在同一边。这是最初的条件,然后就是。。。有m对通奸关系。。。哇这样这的好吗,我还是个孩子5555~有通奸关系的不能在一边(注意这里的通奸关系是任意的,可以男男女女男女,新郎新娘也可以。。。) (我tm读完题就知道出题人脑子不正常了。。。) 然后呢,新娘由于原创 2017-07-20 10:49:15 · 215 阅读 · 0 评论 -
HDU 1814 Peaceful Commission (最小字典序 2-SAT)
思路:因为要解决最小最小字典序的问题,所以经典的2-SAT解决方法就没用了。。。只能暴力dfs。。#include <iostream>#include <algorithm>#include <cstdio>#include <string.h>#include <queue>using namespace std;const int maxn = 8010*2;struct edge原创 2017-07-20 10:23:16 · 116 阅读 · 0 评论 -
POJ - 3678 Katu Puzzle (2-SAT)
思路:2-SAT模板题,注意建边。 假设有点 i1 , j1, i2, j2 当只能选 i1 和 j1 点时,这样加边: addedge(i1,j1),addedge(j1,i1); addedge(i2,i1),addedge(j2,j1);//构造这组边为了使选i2,j2非法,因为只能选i1和j1#include <iostream>#include <algorithm>#incl原创 2017-07-15 19:30:16 · 115 阅读 · 0 评论 -
POJ 3207 Ikki's Story IV - Panda's Trick (2-sat)
题意:有一个有两个面的圆,给你p条边,每条边的端点都在圆上,问你能不能通过把这些边放在正面或反面,来达到这些线段都不相交的状态。 每条边当作一个点,正面和背面两种状态必取其中一种。 2-sat题。构造必选规则,然后跑tarjan缩点判断是否有矛盾,没有则一定能找到一种解。(因为tarjan跑出来一定是有向无环图(DAG))#include <iostream>#include <algorit原创 2017-07-15 19:24:01 · 99 阅读 · 0 评论 -
HDU 4738 Caocao's Bridges (割边)
坑点:一开始就是不连通的时候,不需要去炸桥,所以是0.如果是联通,并且最小的桥的权值为0,那么至少也得派一个人去炸。。。注意判断边的次数。#include <cstdio>#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int maxn = 1100;struct原创 2017-07-15 10:24:48 · 241 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX (最大流)
坑点:注意虽然设备没有重复的名字,但是插座会有。注意转换器的种类是k,个数无限。同时还得注意转换器是单向的。。。然后就是自己的问题了。。我的isap模板没有考虑gap全是0的情况。所以碰到完全不连通的图就gg了。。(t了)cin关了同步还是很强大的。(虽然队友说有的题还是会卡cin。。#include<iostream>#include<cstdio>#include<cstring>原创 2017-07-30 16:51:19 · 195 阅读 · 0 评论 -
HDU 3605 Escape (缩点 + 最大流)
思路:因为每个人对于m个星球都只能是1或0,所以一共 2m2^m 种状态。又因为m最大为10,1024中状态远远小于100000个点,所以我们按照状态缩点就好。 建边的话,s连每个状态的点,容量为点的个数。星球的编号连t; 中间的边直接容量直接为inf就好。 直接看代码:ps:听说曾将是1s而且数据贼弱。所以加强了数据是很自然的吧所以网上的ac代码都t了。。。所以很自然的加到了2s。原创 2017-07-31 16:39:27 · 199 阅读 · 0 评论 -
HDU 3667 Transportation (最小费用最大流)
注意:拆边的方法: 由于题目中说了要花费 ai∗x2a_i*x^2 的代价,而且又因为 1≤c≤51 \leq c \leq 5 所以我们将之拆成容量都为1的边。 那么如何控制费用呢? 按照题目要求我们的费用得是这样的(我省略了系数a): 1 4 9 16 25 所以将一条容量(c)为5的边拆成: 1 3 5 7 9 加起来满足题意,就算只走起中的几条也是满足的。 然后就是上模板了。原创 2017-07-31 20:05:05 · 218 阅读 · 0 评论 -
HDU 5878 I Count Two Three (dfs+二分)
题意:给你一个数n,然后给你2,3,5,7这四个素数,令 m=2i∗3j∗5k∗7l{m = 2^i*3^j*5^k*7^l} i,j,k,l分别从零开始取,问你能取出来的m里比n大的最小的那个数是多少思路:先dfs搜一遍,将所有范围内可能的取值都存到数组里,然后二分查找。AC代码:#include <iostream>#include <algorithm>#include <cstdio原创 2016-09-17 18:16:33 · 221 阅读 · 0 评论