![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
HumveeA6
这个作者很懒,什么都没留下…
展开
-
强联通分量tarjan算法(模板)
没啥好说的,唯一要注意的就是那些单独的点每个点都会被当做自身一个强联通分量,也就是有不少的强连通分量里面可能只有一个元素……直接上代码int dfn[105],low[105],scccnt=0,sccindex=0,belong[105];bool instack[105];stack<int>sta;vector<int>G[105];void tarjan...原创 2018-03-07 20:42:31 · 265 阅读 · 0 评论 -
洛谷P3159
费用流题,构图非常巧妙。 考虑每个点的交换限制的约束,一看就知道是点容量,但是这里不是一分为二,而是一分为三。 首先我们把问题化简,变成对于原图上所有黑点,找到一个新图中的黑点,进行多次交换后到达。我们看到多次交换实际上是走了一条路径(这里不是最短路) 。对于这条路径的起点和终点,仅进行了1次交换,而路径上的其他点都交换了2次。所以我们需要构造一种图来把这个交换次数的差异体现出来,于是: ...原创 2018-03-12 10:21:34 · 194 阅读 · 0 评论 -
洛谷P3980
连边方法(以下描述中,用二元组(f,w)表示容量为f费用为w的边): 对于每一天向后一天连边(inf-ai,0) 对于每一种志愿者选择i,s向t+1连边(inf,ci) 从超级源向第一天连边(inf,0) 从最后一天+1向超级汇连边(inf,0) 然后从超级源向超级汇跑费用流。 为什么这样跑会正确呢?可以发现,第一次网络流后所有天数边的容量会被填至max-a_i (max为需求最大...原创 2018-03-12 11:10:10 · 232 阅读 · 0 评论 -
POJ3268
题目大意:给出n,m,代表牛数和边数,接着是m条有向边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出 N<=1000,M<=100,000题目本身没啥难的,就是稍微要转化一下要想清楚,可以画个图很快就明白了; 每头牛返回的最短时...原创 2018-03-05 22:49:00 · 314 阅读 · 0 评论 -
Aizu 2249
以dis为权值,求最短路,再开一个pre数组,pre[i]表示从首都到i城的最短路中,i城的上一座城市到i城的cost。最后将求出的最短路所有pre加起来就好了(为什么这样,画图可以考虑考虑,大概还是有道理的) 因为你始终还是要求首先满足最短路这个条件,之所以可以删去一些路,就是因为一些路有重复。如果用最小生成树的话这题似乎并不好弄。同时,i城到首都的最短路可能有多条,这时pre里面存的是多...原创 2018-03-05 23:34:23 · 386 阅读 · 0 评论 -
Aizu 2200/AOJ2200
题目大意:快递到了:你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处。而且岛上只有一条船,下次想走水路还是得回到X处才行;两个镇子之间可能有两条以上的水路或旱路;邮递员必须按照清单上的镇子顺序送快递(镇子可能重复,并且对于重复的镇子不允许一次性处理,比如ABCB的话...原创 2018-03-06 08:54:29 · 448 阅读 · 0 评论 -
Educational Codeforces Round 40 D. Fight Against Traffic
题意大致就是给定一幅无向图,起点,终点,然后问在那些没有用一条路不经过其他点直接连通的点之间连新的路,并且新的路不应该改变起点到终点的最短距离,问这样的路有多少条; 朴素25%的算法,就是枚举所有的点对,然后如果两个点之间没有直接的路,就加一条然后跑最短路,与原距离比较。从第8个点开始就会tle…. 比较机智的算法就是,以s,t分别为起点跑一次最短路,然后枚举所有没有直接相连的两个点a,b,如...原创 2018-03-22 22:09:45 · 172 阅读 · 0 评论 -
Aizu2224
题意:一个邪恶的女巫因为嫉妒Nicholas家的猫可爱,就施了魔法让他家的猫咪困在卷子里出不来了(要不然说她邪恶呢)。现在给出她施魔法变出来的桩的坐标,栅栏i与栅栏j(是一个整体,也就是给出了一条边,边的长度是第i个桩与第j个桩间的长度)。现在让你求最少需要破坏多长的栅栏才能让可爱的猫咪都出来。分析:若想要让猫咪出来的话,肯定是不能有环了。那么现在就有一个思想:算出全部边长总和,然后减去可以构...原创 2018-03-06 15:29:57 · 236 阅读 · 0 评论 -
洛谷P1197
如果从正面去做,每干一个点跑一次tarjan之类的,肯定会tle;所以不妨反(倒着)着来,把摧毁星球变成添加星球,这样就是每次跑并查集了。至于如何快速确定联通块的数量嘛,并查集每连一条边就是减少了一个联通快,不过要注意的是初始的时候联通快的数量是n-k!!!!此外还是有不少小坑需要留意的。#include<cstdio>#include<iostream>#incl...原创 2018-03-06 17:38:30 · 330 阅读 · 0 评论 -
CF 472B Mystical Mosaic
刚开始的时候考虑过各种暴力,不过似乎都太复杂了以至于写着写着就出错了或者写不下去了。这题其实有非常简便的做法。对于矩阵中的每一列,如果在该列的某一行处是”#”,那么在选中该列的同时该行也是一定要同时选中的。那么,对于任意的两列i,j,如果他们需要选中的行一样,OK,没问题,这两列可以在同一次选择中被选中。但是,如果i,j需要选择的行不一样,那么他们肯定就不能在同一次中选择了,否则的话这两列肯定会多...原创 2018-03-28 15:49:33 · 344 阅读 · 0 评论 -
洛谷P2761
题目标签写着网络流,但是好像跟网络流啥关系也没有哇qwq…. 关键要看出补丁可抽象为边,错误的各种情况是点,而且错误种类很少,所以可以用二进制状态压缩… 然后关键点就是位运算了....这个一定要想清楚...状态用stand表示,软件必须包含b1,那么就是stand&b1必须为b1,不能包含b2,那么就是b2&~stand必须等于b2,然后修复问题就是stand&a...原创 2018-04-06 10:40:54 · 207 阅读 · 0 评论 -
洛谷P4016
题目标签写着网络流诶….那么问题就是如何建图了…看到题解里一波大神用平均值来计算…但是蒟蒻没想到诶…所有我就比较暴力了…. 对于每个点一拆为二(ia,ib),建立超源超汇,然后对于每个点,从源点s向其连一条容量为c[i],费用为0的边,从ia向ib连一条容量为无限,费用为0 的边(因为可以不停的把别的地方的货物搬到ia,然后从ib搬到下一个点去,ia到ib搬运当然是不用钱的),然后从ib向汇点t...原创 2018-04-06 11:28:09 · 272 阅读 · 0 评论 -
SGU 194/LOJ 115(无源汇可行流模板)
题意:给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质。并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li。例如:46(4个点,6个pipe) 12 1 3 (1-&gt;2上界为3,下界为1...原创 2018-05-17 19:19:17 · 528 阅读 · 0 评论 -
Codeforces 467 Div2 D
题目非常显然可以用记忆化搜索来做,但是有几个地方需要考虑。首先是每搜到一个点的时候需要知道这个点是谁在走,虽然说可以通过记录步数来判断,但是记忆化的时候需要分开来记忆,并不是很好办。解决方案是拆点,也就是把原来的点v拆成v<<1(P走这个点)和v<<1|1(V走这个点), 如果原图中有一条u->v的边,那么我们连两条边: (u,0)->(v,1) &...原创 2018-04-27 12:55:53 · 232 阅读 · 0 评论 -
2018 Spring Training 图论 合集
https://cn.vjudge.net/contest/229893#overview 题目链接 A.Uva 302 判断能不能走就是一个一笔画问题,(欧拉回路),因为题目要求是要回到原点,因此所有点的度都必须是偶数才能满足要求。操蛋的是输出路径的时候是要输出路径 编号并且要求输出路径编号字典序最小的路径。本蒟蒻没想到什么好办法,于是每个点拿了一个map存路径,第一个键值是路径的编号,...原创 2018-05-27 19:05:42 · 213 阅读 · 0 评论 -
LOJ 117 有源汇有上下界最小流(模板)
建图方法 将有上下界的网络流图转化成普通的网络流图 首先建立附加源点ss和附加汇点tt 对于原图中的边x-&amp;amp;gt;y,若限制为[b,c],那么连边x-&amp;amp;gt;y,流量为c-b 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和 若d(i)&amp;amp;gt;0,那么连边ss-&amp;amp;gt;i,流量为d(i) 若d(i)&amp;原创 2018-05-30 21:48:21 · 360 阅读 · 1 评论 -
LOJ 116 有源汇有上下界最大流(模板)
建图方法 将有上下界的网络流图转化成普通的网络流图首先建立附加源点ss和附加汇点tt 对于原图中的边x->y,若限制为[b,c],那么连边x->y,流量为c-b 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和 若d(i)>0,那么连边ss->i,流量为d(i) 若d(i)<0,那么连边i->tt,流量...原创 2018-05-30 21:53:28 · 316 阅读 · 0 评论 -
有上下界的网络流 做法总结
无源汇可行流建图方法 将有上下界的网络流图转化成普通的网络流图首先建立附加源点ss和附加汇点tt 对于原图中的边x-&amp;gt;y,若限制为[b,c],那么连边x-&amp;gt;y,流量为c-b 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和 若d(i)&amp;gt;0,那么连边ss-&amp;gt;i,流量为d(i) 若d(i)&amp;lt;0,那么连原创 2018-05-30 21:58:03 · 574 阅读 · 0 评论 -
(模板) 最小生成树Prim算法
算法跟Dijkstra很像 ,但是要特别注意两点:1.最好使用一个额外的数组来保证每个点只被访问一次,否则的话应该保证在35行处使用e.dis>=dis[e.num]而不仅是>,否则会造成一些相等的额外相加。 2.40行的地方要注意与Dijkstra的区别!!不是加而是直接换!!!#include<cstdio>#include<iostream>#i...原创 2018-03-04 22:57:13 · 130 阅读 · 0 评论 -
(模板)最小生成树,Kruskal算法
并查集记得初始化!!!#include&lt;cstdio&gt;#include&lt;iostream&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt;#include&lt;vector&gt;using namespace std;struct edge{ in原创 2018-03-04 20:10:21 · 176 阅读 · 0 评论 -
洛谷P2053修车
我们把每个人拆成n个点,一共m乘n个,其中任意一个记为a[i,j],也就是第i个人修的倒数第j辆车。这里要注意,这个倒数第j是相对于第i个人的,并不是总体上的倒数第j辆。我们再开n个点,其中任意一个记为k,也就是第k辆车。我们的原始数组,第i个人修第k辆车,记为b[i,k]。把a[i,j]和k一连,就是第i个人倒数第j个修车,修的是第k辆。因为这辆车是倒数第j个修,所以一共要有j辆车等待b[i,k...原创 2018-03-11 22:30:23 · 192 阅读 · 0 评论 -
洛谷P3387
思路就是跑tarjan缩点,把同一个联通分量里的点全部缩成一个点,所有的权值都记在这个点上,然后根据tarjan的结果,在不同联通分量之间重新建图,联通分量里连出去的边现在全部归结到剩余的这个点上,连进来的边也同理。然后统计那些入度为0的点,它们肯定能跑出最好的结果,因为入度不为0的点肯定会被那些入度为0的点跑到。对于这些点每个点跑一次spfa,统计答案即可。实际操作中一定要小心…很容易出错…...原创 2018-03-08 13:13:12 · 298 阅读 · 0 评论 -
51Nod - 1459
很裸的最短路模板题,只要在更新路径时如果路径一样长更新一下权值就可以了。但是用spfa一定要注意如果路径一样长的时候也要把那个点再入队啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!#include<cstdio>#include<iostream>#include<vector>#include<algorithm>#inc...原创 2018-03-14 23:49:20 · 126 阅读 · 0 评论 -
(模板)割点(割顶)tarjan类算法
题目的大致描述:给出一个n个点,m条边的无向图,求图的割点。 个人说不清楚,放几个图吧 代码如下:vector<int>G[100005];int sccindex=0,low[100005],dfn[100005];bool vis[100005],gd[100005];int ans=0;void tarjan(int v,int fa)//其实这题...原创 2018-03-08 16:45:55 · 357 阅读 · 0 评论 -
差分约束(模板)
对于每个不等式 x[i] - x[j] <= a[k],对结点 j 和 i 建立一条 j -> i的有向边,边权为a[k],求x[n-1] - x[0] 的最大值就是求 0 到n-1的最短路。 如果给出的不等式有”<=”也有”>=”,又该如何解决呢?很明显,首先需要关注最后的问题是什么,如果需要求的是两个变量差的最大值,那么需要将所有不等式转变成”<=”的形式,建图...原创 2018-03-15 10:43:51 · 257 阅读 · 0 评论 -
51Nod - 1366
按理说是个模板题,一开始以为是差分约束然后搞了搞总是只能过去一部分点,不知道为啥==…. 然后发现其实floyd跑一遍就行了,数据范围小的可怜…. 最大差值就是最短路里面的最大值…. 卒….#include<cstdio>#include<iostream>#include<cstring>#include<string>#in...原创 2018-03-15 13:41:49 · 144 阅读 · 0 评论 -
51Nod - 1640
开始想着二分最大值,然而调了调怎么都不对QAQ…. 然后看了一下解答: 最小生成树确定最小的边究竟是多少,因为你要求最大边最小嘛…那这样肯定能求出最小值,但这样结果未必最优….所以,我们再倒着去加入并查集就好了,从最大边开始搞一个最大生成树 这样贪心肯定是对的嘛QAQ….然后总长度要用longlong,会爆int…#include<cstdio>#include<io...原创 2018-03-15 17:14:02 · 193 阅读 · 0 评论 -
(模板)最小费用流
最大流+SPFA结合体,小心即可。#include<cstdio>#include<iostream>#include<vector>#include<queue>#include<algorithm>#include<cstring>using namespace std;struct edge{ ...原创 2018-03-09 20:06:28 · 175 阅读 · 0 评论 -
(模板)二分图最大匹配,最大流算法
转换为最大流做即可。注意加边的技巧。 代码如下:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<queue>using namespace std;struc...原创 2018-03-09 23:08:35 · 1639 阅读 · 1 评论 -
洛谷P2765魔术球问题(网络流24题)
首先我们考虑如何建图,即表达相邻球之间的关系。 可以将一个球拆点为Ai和Bi,先从源点S向Ai连容量为1的边,从B_i 向汇点连容量为1的边。对于能够与它编号和为完全平方数的球j,连接A_j和Bi。 枚举球数,球数每增加1就建立新加入的球的关系,并且重复地跑最大流。柱子数对于球数存在一种单调递增的相关关系,我们这样可以求出某一柱子数下最多能放置的球数,因为当新加入的球能够加入柱子时,重复跑最大...原创 2018-03-10 09:59:00 · 262 阅读 · 0 评论 -
洛谷P2766最长不下降子序列问题(网络流24题)
【问题分析】第一问时LIS,动态规划求解,第二问和第三问用网络最大流解决。【建模方法】首先动态规划求出F[i],表示以第i位为开头的最长上升序列的长度,求出最长上升序列长度K。1、把序列每位i拆成两个点i.a和i.b,从i.a到i.b连接一条容量为1的有向边。2、建立附加源S和汇T,如果序列第i位有F[i]=K,从S到i.a连接一条容量为1的有向边。3、如果F[i]=1,从...原创 2018-03-10 11:51:10 · 339 阅读 · 0 评论 -
最小路径覆盖(模板)
对于一个给定的有向无环图(DAG),求其最小路径覆盖。题目可参见洛谷P2764。 【问题分析】 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决。 【建模方法】 构造二分图,把原图每个顶点i拆分成二分图X,Y集合中的两个顶点Xi和Yi。对于原图中存在的每条边(i,j),在二分图中连接边(Xi,Yj)。然后把二分图最大匹配模型转化为网络流模型,求网络最大流。 最小路径...原创 2018-03-10 16:49:07 · 314 阅读 · 0 评论 -
(模板)二分图匹配匈牙利算法
似乎只有在很少的奇怪的情况下才非得用匈牙利算法而不能用最大流的算法(比如洛谷P1640?)#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<vector>using namespace std;vector<...原创 2018-03-10 22:56:35 · 158 阅读 · 0 评论 -
BZOJ 1196 [HNOI2006]公路修建
之前做的时候一直想的都是最小化最大值嘛,于是二分答案,但是怎么都搞不出来。今天看了一眼突然想到其实根本并不用二分哇,把边先按一级费用排序,用kruskal选出最便宜的k条公路,再按二级费用排序,用kruskal求出最小生成树,中间最高的费用就是答案。交上去就AC了…..#include<cstdio>#include<iostream>#include<a...原创 2018-03-17 08:57:22 · 143 阅读 · 0 评论 -
(模板)SPFA
比Dijkstra好写的算法,唯一的问题就是要小心…手残写错一个字母真的可能好久都看不出来 判断负环可以统计每个点的入队次数,如果有超过n-1次的就是有负环了。#include<cstdio>#include<iostream>#include<vector>#include<algorithm>#include<queue&...原创 2018-03-04 16:00:06 · 160 阅读 · 0 评论 -
(模板)Floyd算法(多源最短路)
最最最需要注意的就是因为每次是拿一个点出来考虑能否把别的路变短,所以k一定是最外层循环。以及要记得初始化为无穷大或无穷小。 可以通过检查是否有dis[i][i]<0来判定是否有负环存在int dis[105][105]; memset(dis,0x7f,sizeof(dis)); for(i=1;i<=n;i++) for(j=1;j<=n;...原创 2018-03-04 10:10:13 · 342 阅读 · 0 评论 -
(模板) Dijkstra算法(priority_queue优化)
写法1,利用struct存当前最近点的信息:#include<cstdio>#include<iostream>#include<vector>#include<algorithm>#include<cstring>#include<queue>using namespace std;struct edg...原创 2018-03-04 10:57:32 · 1326 阅读 · 0 评论 -
洛谷P1129
无论原图是怎么样的,我们都能把每一行放在我们期望的位置上(当然合不合法先不说) 原理参照冒泡排序 //总体的思路就是二分图匹配 //原图中的行序号我们记为i,我们期望得到的图中的行序号记为j //枚举原图中的行i,如果在我们期望的图中它放到第j行是合法的(对角线为黑子即为a[i][j]=true) //那就让j–i连一条边 //这样我们就得到了一个二分图 //说明:mat...原创 2018-03-11 18:46:31 · 233 阅读 · 0 评论 -
洛谷P4009 汽车加油行驶问题
虽然写着网络流,但是似乎spfa跑最短路更好做一些。 需要注意的是如果某个地方有油站,那么是一定要加满油才能往后走的。 然后距离的记录以及边与平时的spfa有一些不同。 每个点如果有油,可以往4个方向转移。 别的就没有什么了。#include<cstdio>#include<iostream>#include<algorithm>#incl...原创 2018-05-31 21:15:08 · 480 阅读 · 0 评论