![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
————图算法————
eIectron
优美的代码是成功AC的第一步。看着那么多博客不再更新,这就是我几年后的状态吗?要是走了就再也不回来了。
展开
-
HDU 4725 The Shortest Path in Nya Graph(最短路)
点击打开链接出题人的英文太优秀了,题目好像什么都没说一样。看了别人的博客才明白,别人猜题意能力还是比我厉害太多了。题目也是错的。题意归结为(我还是不是很懂,用自己语言描述下):假设有一栋楼,有n层,相邻两层之间的移动的花费为c。然后又有n个节点,他们分别在li层。然后有m条特殊的路径,每条路经上u,v两点之间可以相互传送,花费为w。求节点1到节点n的最小花费。坑点1:如果两个节点在同一原创 2017-08-11 16:06:33 · 232 阅读 · 0 评论 -
2017年多校赛第九场 1005 FFF at Valentine(缩点+拓扑排序)
其实缩点很容易想到,就是不怎么会用拓扑排序所以一直卡着判断这个地方。代码如下:#include #include #include #include #include #include #includeusing namespace std; const int N = 1005; // 点的最大个数 stack sta;原创 2017-08-23 15:57:51 · 298 阅读 · 0 评论 -
POJ 2391 Ombrophobic Bovines(二分+网络流)
题意:给出n个牛棚,一开始每个牛棚有一些牛,但是每个牛棚只能住下规定数量的牛,每个牛棚之间有路可以互相到达,但是要花费一些时间,问是否有办法使得所有牛都有牛棚住,如果有办法,输出最小的时间花费。解法:因为是问时间花费,所以很容易就想到了二分上面。先跑一边floyd得到每个牛棚之间的花费时间,直接二分时间,不断建图即可。代码如下:#include#include#include#i原创 2017-09-13 13:19:06 · 200 阅读 · 0 评论 -
HDU 1285 比赛排名(拓扑排序)
这是我写的第一道拓扑排序的题目,但是很神奇的发现,这道题目用dfs那种拓扑很难写出来,我想了很久也没想法,最后只能求助于题解,然后发现真的没有人用dfs来写。。。我也是醉了。后来看别人题解发现了一种很巧妙的方法,大牛果然多,像我这种弱鸡只能默默地看题解。08:比赛排名--拓扑排序总时间限制: 2000ms单个测试点时间限制: 1000ms内存限制: 65535kB描述有原创 2016-07-11 11:04:29 · 591 阅读 · 1 评论 -
HDU 1317(spfa找环)
题意:给出n个点,每个点都有能量,一开始你在点1,有100能量,你要去点n。每到达一个点就会拿到这个点的能量,每到一点的能量不可以小于等于0,。问是否有可行方案。解法:想了想知道这是个最长路,但是看到样例就有环这个问题,想了想处理一下环但是处理得非常不好。后来看到别人的学习了一波,虽然我的思路也是这样但是我就是写不出来。。。如果某个点入队列次数等于n,就让他的dis为INF,如果大于n,就不让原创 2017-08-28 15:31:33 · 387 阅读 · 0 评论 -
WOJ 124 Football Coach(网络流)
岛娘的网络流专题里面的一道题。武汉大学OJ上的一道题,典型的竞赛排名问题,要使得第N支队伍分数最高,问是否可能。解法:竞赛排名问题一种常见的方法就是把每个比赛当成一个点,然后连向他所关联的两个队伍。对于特定的题目,我们还需要挖掘他深层的条件。比如这道题,我们首先让第N支球队关联的比赛都让第N支球队赢。如果此时还有队伍比他分数高或者等于他的分数,那么直接输出NO即可。否则接下来我们把原创 2017-09-14 08:05:47 · 308 阅读 · 0 评论 -
SGU 326 Perspective(网络流)
岛娘网络流专题里面的一道题。又是个竞赛排名问题,跟上一篇WOJ的题目其实是一样的解法。只不过这道题要求第1支队伍是冠军,如果有队伍和第一支队伍同分的话也是可以的,这是和上一道题不同的地方。代码如下:#include#include#include#include#include#include#include#include#include#include#incl原创 2017-09-14 08:20:04 · 252 阅读 · 0 评论 -
HDU 6201 transaction transaction transaction(最短路)
解法:由于每个点有一个商品,花费为w,我们想卖出去,但是路也有花费,如果在某个点卖出去,相当于赚回wi元。那么我们建图,一个起点向每个点连接一个边权为-wi的边,每个点向终点连接一个边权为+wi的边,原图中的边也加进去,从起点向终点跑一边spfa即可。代码如下:#include#include#include#include#include#include#include#i原创 2017-09-14 19:50:52 · 247 阅读 · 0 评论 -
2017 Bubble Cup X - Finals D. Exploration plan(最短路+二分+网络流)
比赛时候写不出来,因为发现费用流是无法求出每次的时间的,于是绝望中挂机。然后看了一发题解,大意就是:1.先每个点跑一次最短路,然后构出一个每个点到另外一个点的距离的图。2.然后二分时间,下界为0,上界为稍微大于所给时间的值。3.每次得到mid后建图,源点为0,N个队伍分别是1……N,源点向每个队伍连接一条流量为1的边,每个队伍所在的城市for一遍到其他城市的距离,如果小于等于mid原创 2017-09-04 10:06:21 · 458 阅读 · 0 评论 -
POJ 1149 PIGS(网络流经典建图题)
题意就是:给出m个猪圈,每个猪圈都有一定数量的猪,然后有n个顾客来买猪,他们每个都有一个最大的买猪数目。每次他们会按照顺序打开某些猪圈买猪,然后离开,此时卖家就在打开的猪圈里面重新分配猪,没有打开的猪圈不参与,然后全部猪圈都会关闭,一直循环。经典的网络流题目。每个猪圈剩下多少猪是由第一个进入这个猪圈买猪的人决定的,所以每个猪圈和第一个进入这个猪圈的买家连一条流量为无穷的边。后进来的买家则只能从原创 2017-08-23 14:38:03 · 340 阅读 · 0 评论 -
BZOJ 1787 Meet 紧急集合 (LCA)
这题很明显就是可以先两个lca,然后得到一个祖先p后再和另外一个,点进行lca得到三个点的最近公共祖先p2,此时三个点之间的距离其实已经求出来了,而这两个最近公共祖先p和p2里面,我们自然是选择深度较高的那个作为答案。然后一个三个数字一共三种这样的情况,枚举一下,不断更新答案即可。但是看了别人的做法发现有一种更加简单的方法,就是直接两两lca得到三个最近公共祖先p1,p2,p3,如果有两个原创 2017-09-04 11:57:13 · 319 阅读 · 0 评论 -
2017年多校赛第九场 1006 Senior Pan(dijkstra套路题)
点击打开链接这道题有很多解法,我是按照题解的做法写了一遍。题意:给出一个有向图,然后有k个点,问这k个点两两之间的最短距离的最小值是多少。解法:题解是把k个点按照每个点二进制位的不同分成两个集合,然后求一次多源最短路。由于最大的数是1e5,所以也就到个。。。2^17的样子?由于是有向图,还需要正反都跑一遍。所以一共跑34次最短路就出来了。。。代码如下:#include#i原创 2017-08-25 12:08:09 · 495 阅读 · 0 评论 -
HDU 4888 Redraw Beautiful Drawings(网络流 + 判环(不能用强联通))
题意和这个差不多http://blog.csdn.net/llzhh/article/details/77353532,只不过这道题改成棋盘上每个点的大小是0到k的。建图什么的都一样,但是我发现我用一开始强联通的写法是过不去的,因为判环的地方tarjan是找极大强联通分量,这并不是我想要的,比如样例中一行四列那个。但是在上一题竟然过了。而且上一题没有判断行和列的和都相等也过了,数据实在是太水了原创 2017-08-18 17:59:10 · 194 阅读 · 0 评论 -
HDU 4975 A simple Gaussian elimination problem.(网络流 + 强联通判环)
题意:给定一个n*m的棋盘,每一行的和给出,每一列的和给出,问是否存在这种摆法。每个位置放的数字都只能是0到9。解法:建图方面,源点和每一行连一条流量为当前行的和的边,每一列和汇点连一条流量为当前列的和的边,然后每一行和每一列都连上一条流量为9的边。跑一边dinic即可。这个问题卡的是如何判断有多种情况符合,我写了个dfs然后T了。判环的话,前段时间写的一道题找负环是用spfa,这道题的话其实原创 2017-08-18 09:11:33 · 196 阅读 · 0 评论 -
2017年福建省赛 FZU - 2271 X(floyd)
死于看题,早就写完的,然后一直wa,后面找题解发现,输出竟然还有个case。。。题意:给出n条路,问最多可以删除多少条路,并且要保证原本两个城市之间的距离不会变大。解法:首先用两个数组graph和G把距离保存起来,重边就直接取最小的就行了。然后用G数据跑一遍floyd,记录一下哪些边是松弛过的。然后再跑一边,判断一下是否这里本身有边,如果有边,看看是否松弛过,如果松弛过,答案++。其实原创 2017-08-12 21:13:05 · 237 阅读 · 0 评论 -
CodeFroces 96D Volleyball (最短路预处理跑最短路)
题目大意:给出n个路口,m条路,m条路是无向的,长度为w。然后每个路口都有一个出租车司机,只要坐他的车,就必须交c元,他最多可以载你走的长度为t的路。问从x到y的最小花费是多少。这道题一开始写懵逼了,想直接跑一遍最短路,都测到test31了,然后wa了。后来想了好久发现,有可能一开始到达了a点,然后走到b,c后回到a,此时也是一种情况,虽然回到来的花费肯定是上涨了,但是他有可能能跑的距离变长了原创 2017-08-14 11:46:28 · 233 阅读 · 0 评论 -
百度之星初赛B 度度熊的交易计划(最小费用可行流)
这道题说实话挺简单的,但是建图上太蠢了导致当时一直TLE,现在才补出来。当时用的是把一个点拆成三个点的做法,导致复杂度不知道扩大了多少倍。。。现在来总结一下,当时建图的方法按照样例来看是:现在看来这个图是完全可以优化的,因为源点连出去的边全都是流量为INF,费用为0的边,那么此时源点连出去的点是无用的,直接合并到源点即可。汇点也是。所以就可以得到下面这种建图:这样瞬原创 2017-08-14 16:38:42 · 1431 阅读 · 0 评论 -
POJ 2175 Evacuation Plan(网络流消负圈算法)
这是挑战上的一道题。一开始看到这道题,我是直接套最小费用流上去写的,然后无限T。。。后来看到,原来不是要找最优的情况,只需要输出一组答案比当前结果花费小即可。然后看书,才知道有消负圈算法这种东西。费用流中最优的网络是不存在负圈的,最最简单的理解就是,可以看到上面这个图,我们费用流是在最大流的前提下找最小费用,但是上面这个图肯定不是最大流,s到t还有1个流量单位。何为负圈原创 2017-08-05 11:11:33 · 948 阅读 · 0 评论 -
LOJ 「网络流 24 题」太空飞行计划(最大权闭合子图)
https://loj.ac/problem/6001原来还有这种操作。这种最大权闭合子图问题的套路就是:权值为正的,从源点向该点连一条流量为权值大小的边。权值为负的,从该点向汇点连一条流量为权值大小的边。原本的有关系的两个点之间连接一条流量为无穷大的边。最后得到的最大收益 = 权值为正的点的权值之和 - 跑一遍网络流得到的最小割。为什么会是这个结果呢?1.如果原创 2017-07-31 20:52:19 · 370 阅读 · 0 评论 -
POJ 1386 Play on Words(欧拉路经典题)
点击打开链接题意:给出n个单词,然后单词接龙(两个单词拼接时交界处字母要相同 ),问是否可以形成一条链。解法:首先这是很经典的欧拉路的定义。其中欧拉路有两种,一种是欧拉通路,就是指形成一条链的。它满足,只有一个点的入度是1出度为0,一个点的入度为0出度是1,其他点的入度和出度都是偶数并且相等。一种是欧拉回路,就是指可以形成一条环的。它满足,所有点的入度和出度都是偶数并且相等。原创 2017-08-25 11:44:07 · 265 阅读 · 0 评论 -
「网络流 24 题」餐巾计划
这道题目很关键的一点就是,要明白用的餐巾和洗的餐巾是两个系统。所以我们把每一天所用餐巾直接用一个源点和汇点连接。解决第一个系统。此时可能会洗餐巾,所以我们另起一个点,从源点每一天引出脏的餐巾,数目依然是当天所用的餐巾数量,然后从这个点连接到m天后的第一系统的点和n天后第一系统的点,费用分别为f和s,流量为无穷大。当天的餐巾就算不洗也可以留下来,所以我们还需要把这些餐巾连接起来,当天不洗的餐原创 2017-08-30 16:33:10 · 233 阅读 · 0 评论 -
BZOJ 1036 树的统计(树链剖分模板题)
这道题直接用黄学长模版改造过来交了一发。树链剖分还是很好理解的,先给每个点按照dfs序的顺序编号,然后建好一棵线段树,线段树里面的编号就是每个点被分配的编号。建好之后其实并没有赋值,所以再跑一遍循环把每个点的值赋值进去(线段树的单点修改操作)。此时再开始询问即可logn输出答案。代码如下:#include#include#include#includeusing namespa原创 2017-09-16 20:20:33 · 191 阅读 · 0 评论 -
CodeFroces GYM 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) B.street(最短路)
http://codeforces.com/gym/101147/problem/B题意:从最下面到最上面,问非阴影部分的路径长度最短是多少。解法:把所有阴影块所给信息存起来,自己造贴着x轴的阴影块,然后sort一下,从最下面的阴影块往上遍历,每两个阴影块之间必有一条连线,分类讨论一下即可。建好完全图后跑dijkstra(我跑floyd超时了)即可得到答案。代码如下:#includ原创 2017-09-10 08:01:23 · 397 阅读 · 0 评论 -
POJ 2699 The Maximum Number of Strong Kings(枚举/二分+最大流)
岛娘网络流建模汇总里面的一道题。题意:每个玩家都会和另外所有玩家pk,给出每个玩家的分数(赢得pk则+1分),确保所有分数加起来是完全图的边数。定义strong king为:赢得了所有比自己分数高的玩家(最高分的玩家本身就是strong king)。问最多能有多少个strong king。解法:这种比赛的题目很常见的想法就是,把每个比赛当成一个点,然后这个点去连接另外两个玩家。那么建图就很原创 2017-10-02 18:49:11 · 270 阅读 · 0 评论 -
HDU 4280 Island Transport(最大流)
题意:给定一些小岛的坐标,要求从最东边到最西边。问最大流量是多少。解法:裸的最大流。本题确实卡了一下dinic,我用普通的读入挂跑了9s,用fread跑了7400ms。但是看了看别人isap啥都没加跑了5s。有的人用dinic超时是因为板子问题。有的板子里面bfs是从s开始到t,然后dfs也是s到t,这样是不够高效的。因为如果一个图从s开始有很多无用的边根本就到达不了t那种,就会使得d原创 2017-10-02 20:49:22 · 266 阅读 · 0 评论 -
Ural 1277 Cops and Thieves(最小点割集/最小割)
题意:一个团伙去偷一个美术馆,警察决定在路上堵截。警察人数为k,不能在贼窝和美术馆驻扎,只能在图上其他点驻扎,而且驻扎有一个最小人数要求,问警察能否完成任务。解法:又是最小点割集题目,每个点拆点即可,边权为给出的r[i],然后跑一遍最大流求最小割,比较一下是否小于等于k即可。坑点,如果美术馆和贼窝是同一伙人。。。代码如下:#include#include#include#in原创 2017-10-06 16:35:30 · 484 阅读 · 0 评论 -
Vijos 1843 货车运输(最大生成树 + 树上倍增模板)
解法:首先想到肯定是尽量用边权大的边,所以直接用最大生成树建图即可。建完图之后,由于询问数很大,所以要想一个高效的求两点之间边权最小的边的办法。一开始想到树链剖分,感觉很麻烦,代码量巨大。想用LCA的ST表来维护,但是发现维护困难,因为是边而不是点。最后才知道要用树上倍增做。预处理出深度小的点到深度大的i点最小的边权是多少。先求出x和y的lca,然后直接求出x到lca, y到lca的最小边权。取最原创 2017-10-14 18:41:11 · 248 阅读 · 0 评论 -
HDU 3622 Bomb Game(二分 + 2-SAT)
点击打开链接题意:给出n对点,每对点只能选取一个。每个点都会以自己为中心进行爆炸且半径相同,问最大爆炸半径是多少。解法:两个之中选一个,可以考虑2-SAT求解。由于半径是要求的,所以二分半径,然后每次都建图用2-SAT判断看是否可行。此处2-SAT保留的是不能共存的边。代码如下:#include#include#include#include#include#incl原创 2017-10-15 09:09:26 · 291 阅读 · 0 评论 -
POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT)
传送门题意:有一个圆,圆周上有n个顺序的点,然后有m组边,这些边的两个点必须连起来,圆有两个面,你可以在正面连接他们,也可以在反面连接他们。问是否可以使得这m条线不相交。解法:因为这些点是按照顺序排序的,在同一个面的情况下,有两对线分别是1 5,2 6,那么就会发现他们肯定是相交的,其实就是一个规律,a[i] 2-SAT连的是必须共存的点。代码如下:#include#in原创 2017-10-11 21:45:52 · 323 阅读 · 0 评论 -
POJ 3648 Wedding(2-SAT输出一组解)
题意:有新郎新娘举办婚礼,吃饭的时候大家坐在一长方形桌,桌子有两列,新娘坐一列上看对面一列,她定义以下事情会让她不开心:夫妻都在对面一列或有仇人在对面一列。问是否能安排出合理方案使得新娘开心。如果有,输出YES并且输出新娘这一列坐着的人,否则输出bad luck。解法:夫妻不能在同一列,所以夫妻要不在新娘这排要不不在新娘这排,用2-SAT可以很好满足这个条件。然后读入仇人的信息,标记好,用2-原创 2017-10-16 11:28:31 · 371 阅读 · 0 评论 -
HDU 3829 Cat VS Dog (反建法求最大独立集)
反建法求最大独立集一直都是二分图的一大套路。这题目分析的时候,有种选了C1就不能选D1这种感觉,于是把cat和dog放在两边,看是否可以构成二分图求解。但是仔细想想这题目,求的是最多的开心人数,用cat和dog建图并不能说明什么。于是我们想其他方法。我们要的是人数,那么干脆用小孩来建二分图。怎么构造好呢?其实到这里突然很直观的发现,小孩之间的关系?其实就是如果小孩1喜欢C1不喜欢D1,小孩2喜原创 2017-10-25 09:59:20 · 377 阅读 · 0 评论 -
SPOJ Smart Network Administrator(二分+网络流)
岛娘网络流合集上的题目。题意:给出一些街道,一开始只有编号1的家庭有网络,其他家庭要想有网络都要从1号家庭拉网线(且只能从1号家庭拉)。现在要求k个家庭(已给出)有网络,而且还有一个规定就是每个街道的网线颜色必须不一样。问最少要多少种颜色的网线。解法:我们直接构图可以想到,直接用一个起点s到k个家庭连接一个流量为1的边,然后编号为1的家庭作为汇点t。给出的每条道路,如果每条道路流量为INF原创 2017-10-02 14:04:47 · 222 阅读 · 0 评论 -
POJ 1741 Tree (树分治模板题)
点击打开链接题意:给出一棵树,求出两点之间距离小于等于k的点对数目。解法:树的考查十分常见,原因就在于树有一般图不具备的约束条件。如果这是一个一般图,我们想的是,做一次LCA,然后暴力两个点,看是否符合,复杂度达到O(n²),对于题目有1e4个点而且还是多组输入显然是无法接受的。这时候我们就要想到树分治的思想。求两个点的距离是否小于等于k,可以分为两种情况。我们假定一个原创 2017-10-01 16:48:14 · 305 阅读 · 0 评论 -
POJ 3107 Godfather (树的重心模板题)
点击打开链接题意:给出一棵树,求出所有树的重心,并且按编号从小到大输出。直接套模板即可。代码如下:#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;const int maxn原创 2017-10-01 10:24:41 · 503 阅读 · 0 评论 -
[ZJOI2006]物流运输 (最短路+dp)
如果本题没有换线路要k的花费这个条件,很明显就是直接枚举天数,每次都跑一个最短路即可。但是现在有这个条件,我们就要加上dp的思想,来分段决策。解法:1.枚举起始天和终止天,然后排除这个范围内无法一直有效的点,跑一遍最短路,用cost[i][j]记录此时到达港口m的最小花费。2.进行一次dp,dp[i]代表的是第i天开始到第n天的最小花费,边界为dp[n + 1] = -k。然后从第n天原创 2017-09-26 18:42:15 · 274 阅读 · 0 评论 -
NOI 2006 最大获利 (最大权闭合子图)
点击打开链接比较模版的最大权闭合子图。代码如下:#include#include#include#includeconst int maxn = 55005;const int maxm = 1e6;const int INF = 0x3f3f3f3f;using namespace std;inline int read(){ int x=0,t=1,c; wh原创 2017-09-02 11:10:00 · 233 阅读 · 0 评论 -
POJ 1236 Network of Schools(强联通缩点)
题意:给定一些学校的网络,有向的,u可以到v,但是v不一定可以到u,按照实际情况这些学校能互相联系应该是个连通图(我猜的)。现在问最少要给多少个学校发出消息才能使得全部学校都能收到信息。还问了如果想要这些学校能互相联系,要加上多少条有向边。解法:第一问就是裸的tarjan算法,直接缩点找一找入度为0的强连通分量即可。第二问不是很明白,别人给出的结论就是直接取max(入度为0的强联通分量数目原创 2017-09-11 15:52:53 · 170 阅读 · 0 评论 -
POJ 3155 Hard Life(最大密度子图)
详细解法参考胡伯涛的《最小割模型在信息学竞赛中的应用 》论文,下面做了一些注释,仅供参考。。。代码如下:#include#include#include#includeconst int maxn = 1500;const int maxm = 10000;const double eps = 1e-6;const int INF = 0x3f3f3f3f;using na原创 2017-09-03 16:23:10 · 213 阅读 · 0 评论 -
HDU 6214 Smallest Minimum Cut(求最小割的最少边数)
题目大意:给定一个图,从s到t求最小割,要求最小割的边数最少,输出最少的边数。解法:这其实就是一道原题,当时网络赛一搜就搜到了。方法1:先跑一遍最大流,满流的边必定是某个集合的最小割的边(很好理解,每次找增广路的时候,这条路被限制的最大流量就是这条路上流量最小的边,这条边必定对答案有贡献)。此时遍历所有正向边,满流的边使其流量为1,不满流的边重新设定其流量为INF,网络有许多错误的博客在这原创 2017-09-20 16:22:32 · 660 阅读 · 0 评论 -
Uvalive 7037 The Problem Needs 3D Arrays (最大密集子图)
题意:给出一些数字,找出逆序对。令 逆序对的个数/数字个数 最大。解法:我们先将逆序对用线标出来,然后就会发现这就是 边的数量 / 点的数量。这就是图的密度的定义。找最大密度则是用最大密集子图。求最大密集子图的方法见《最小割模型在信息学竞赛中的应用》。代码如下:#include#include#include#includeconst int maxn = 110;const原创 2017-10-07 11:00:31 · 376 阅读 · 0 评论