![](https://i-blog.csdnimg.cn/direct/bcf047700cec406993b906660ed67b9f.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
图论
文章平均质量分 81
汇集各种图论建模技巧
惆怅客123
算法研究痴迷者,ai爱好者
展开
-
欧拉道路/回路总结
欧拉道路可能包含回路,那么在dfs时,可能提前找到回路,这条回路可能不是完整的欧拉道路(因为没有遍历完所有的边!)如果写成前序遍历的话,存储起来的路径就不是一条完整的路径了!如果是后序遍历的话,当dfs时遇到了回路,那么就退出当前栈的搜索并继续寻找其他的路径,最终得到只有一条回路的路径——欧拉回路。可见对于一定要求出欧拉路径的问题,可以不必先检查连通分量数是否唯一,在dfs结束时判断路径是否包含所有点(含重复点)即可。由于是后续遍历,存的路径其实是逆序的,输出时需要注意(当然本题顺序输出逆序输出都可以)。原创 2024-04-25 21:33:21 · 311 阅读 · 0 评论 -
UVA1048/LA3561 Low Cost Air Travel
比如,假设你有一张“城市1->城市2->城市3”的联票,你不能用来只从城市2飞到城市3(因为必须从头坐),也不能先从城市1飞到城市2再用其他票飞到其他城市玩,回到城市2后再用原来的机票飞到城市3(因为机票已经上缴)。} ans[N][M]记录最短路径:ans[i][j]记录当前旅行到了城市i,已经走完行程单前j个城市花费最小时,上个行程旅行到了城市v,已经走完行程单前k个城市,对应转机的机票t。给出票的信息,以及一个或多个行程单,你的任务是买尽量少的票(同一种票可以买多张),使得总花费最小。原创 2024-05-07 22:39:56 · 1092 阅读 · 0 评论 -
求出最大流后构造割集
几个最大流算法构造割集的方法。Edmonds–Karp算法:算法结束时,a[u]>0的结点集合为S,其他结点集合为T。Dinic算法:算法结束时,vis[u]为true的结点集合为S,其他结点集合为T。ISAP算法:算法结束后,还要再调用一次bfs,vis[u]为false的结点集合为S,其他结点集合为T。按照割集的定义,需要将结点分成S、T两个集合,那些一端在S另一端在T的边才是割。不能主观认为满流边就都是割,因为割边一定满流,但部分满流边并不是割。原创 2024-05-15 23:36:07 · 289 阅读 · 0 评论 -
UVa1364/LA3523 Knights of the Round Table
每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置。如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防止赞同和反对票一样多。将不相互憎恨的骑士连一条无向边建图,如果对一个结点(骑士)能找到含奇数个结点且结点不重复的圈,则此骑士至少可以参加一个会议。,所以只需要关注那些不是二分图的双连通分量。更进一步,如果一个双连通分量不是二分图,它至少含有一个长度为奇数的环。中所有结点标记为“在长度为奇数的环上”,最后遍历每个结点,统计出无标记的结点数就是答案。原创 2024-04-26 18:49:37 · 954 阅读 · 0 评论 -
UVa11865 Stream My Contest
二分答案(最小带宽),找出从0出发的最小树形图(需要禁用带宽小于答案的网线),判断权值和是否超过cost即可。固定根的最小树形图可以用朱-刘算法(也称 Edmonds 算法)解决,其时间复杂度为𝑂(𝑉𝐸),此算法不能找出最小树形图的各条边,只能求出其权值和。原创 2024-05-09 19:35:46 · 898 阅读 · 0 评论 -
UVa1006/LA2238 Fixed Partition Memory Management
换句话说,如果程序i 是内存区域j的倒数第p个执行的程序,则它对于总回转时间的“贡献值”为pTi,j,其中Ti,j为程序i 在内存区域j中的运行时间。编程计算最优的内存分配策略,即给定m个区域的大小和n个程序在各种内存环境下的运行时间,找出一个调度方案,使得平均回转时间(即平均结束时刻)尽量小。早期的多程序操作系统常把所有的可用内存划分成一些大小固定的区域,不同的区域一般大小不同,而所有区域的大小之和为可用内存的大小。可是每个程序的运行时间可能和它所占有的内存区域大小有关,因此调度并不容易。原创 2024-05-13 20:51:22 · 791 阅读 · 0 评论 -
UVa11419 SAM I AM
求二分图最大匹配,然后从所有X点集的未匹配点出发做dfs扩展匈牙利树,标记树中的所有点,则X中的未标记点和Y中的已标记点组成了所求的最小覆盖点集。原创 2024-05-14 19:45:36 · 310 阅读 · 0 评论 -
UVa1376/LA3661 Animal Run
以下n-1行每行m-1个整数,表示拦截每条对角线边所需的人数。整个城市是一个网格,另外每个单位方格都有一条从左上到右下的对角线,其中动物园在左上角,动物们的目的地是右下角。每条道路上都有一个正整数权值,代表拦截这条边所需要的工作人员数,如下图所示。你的任务是派尽量少的工作人员,使动物无法从动物园走到目的地(动物只能经过没有被拦截的边)。先将原s和t连一条边,这样会多出来一个面,叫做附加面,将这个附加面作为对偶图的。以及原图的每个面构成对偶图的顶点,某两个面如果共边,则他们之间连一条边。原创 2024-05-08 13:03:07 · 1024 阅读 · 0 评论 -
UVa1086/LA4452 The Ministers’ Major Mess
每个方案要么采用要么否定,可以往2-SAT上想:对每个投了3个或4个方案的人,其某个投票如果被否定,则剩下的投票一定要被采纳;对投了1个或2个方案的人,其投票必须都被采纳,说明部分结点的初始值固定。本题不是对2-SAT问题找一个可行解,而是要判断每一个方案的两个取值可能的情况:两个值(采纳/否定)都取不到,无解;仅取得到一个,答案的此位输出y/n;都可能取到则答案的此位输出?。那就需要对每个结点做dfs/bfs看是否出现矛盾,不矛盾则此结点代表的值可取得,否则此结点代表的值不可取原创 2024-05-23 21:47:45 · 332 阅读 · 0 评论 -
UVa12275/LA4960 Sensor network
本题和UVA1395 Slim Span相同,但数据规模变大,如果依次枚举最小边后跑kruskal更新答案会超时。首先想到了滑动窗口的办法,求一次最小生成树得出初始答案和n-1条边,然后递增最小边形成滑动窗口:将n-1条边中最小边x拿掉,得到两棵树,然后枚举x之后的边加入进来如果构成一棵树则更新答案以及新的最小边,然后继续滑动。这样做虽然最小边总在前进,但是枚举的过程中有回溯,时间复杂度介于𝑂(𝑚𝑛)和𝑂(𝑚^2)之间。对kruskal求解过程加以改造可得到复杂度稳定为𝑂(𝑚𝑛)的算法。原创 2024-07-05 14:18:06 · 972 阅读 · 0 评论 -
UVa1348/LA3310 Tomato Automata
首先构建有向图判断程序是否可以死循环,只需要从顶点1出发跑tarjan算法看是否能找到双连通分量。建图时把loop命令当成pass命令,对于ifgo、pass、loop建边𝑖→𝑖+1(注意i=n时,𝑛→1),对ifgo、jump建边𝑖→𝑥。没有死循环时求起点为1的最长路,分析下Dijkstra、Bellman_Ford、SPFA都用不上,根据题目交代的对循环的限制,其实有复杂度𝑂(𝑛)的直接解法:备忘录dp。原创 2024-06-14 12:22:07 · 849 阅读 · 0 评论 -
UVa1459/LA4748 Flowers Placement
求二分图字典序第k最大匹配方案,用dfs枚举并剪枝求解。找出每列可以放的花的编号,连边,接着跑一下二分图匹配,看能否完美匹配,如果不能的话,表示无法摆放。跑这个二分图匹配不是白跑的,后面用得上。因为要第k个字典序,所以要枚举每一列所能摆放的花。这里需要一个剪枝,如果当前枚举的列为第j列,往后的j+1到第N列如果无法进行匹配的话,那么就可以剪掉了。原创 2024-07-11 20:58:08 · 217 阅读 · 0 评论 -
UVa12273/LA4958 Palindromic DNA
对每个子序列,要满足回文形式,则必然是原DNA序列某些位置最终要变成相同的,这可以用并查集处理。然后考虑每个集合里面原始的不同碱基情况:如果四种都有,显然无法修改,无解;如果有三种,或者有两种并且是相对碱基(AT/GC),则一定要把相对碱基都做修改;如果有两种并且是相邻碱基,则一定要修改一个并且另外一个不能修改;如果只有一种,则已经是回文形式,无需修改。原创 2024-06-02 17:28:32 · 762 阅读 · 0 评论 -
UVa11604 General Sultan
很好的一道图论建模题目!将每个模式串的每一个字符看成一个结点,并额外增加起点s、终点t两个虚拟结点。首先起点与每个模式串的首字母连一条有向边。对于第i个模式串,考虑其第ℎ个字符开始的子串(对应节点u),若其与第j个模式串做匹配(注意ℎ=0时,𝑗≠𝑖)满足至少一者匹配到结尾,则连有向边:两者都匹配完,𝑢→𝑡;模式串j的首个未匹配节点是v,𝑢→v;子串h的首个未匹配节点是w,𝑢→w。原创 2024-05-29 21:14:54 · 1238 阅读 · 0 评论 -
UVa12227/LA4618 Wormholes
由于穿过虫洞后时间的迁移量d可能为负数,一旦经过某虫洞存在负圈,那么即便首次到达虫洞入口的时间晚于其形成时间t,只要绕着此圈不停地来回,到达虫洞两端点的最早时间将回退到t和t+d。因此只要预处理虫洞,看每个虫洞是否能找出负圈,如果能找到负圈那么达到虫洞两端的最早时间为𝑡𝑠=𝑚𝑖𝑛(𝑆𝑎𝑠,𝑡)和𝑚𝑖𝑛(𝑡𝑠+𝑆𝑠𝑒,𝑡+𝑑)。预处理之后,跑一边Bellman Ford就能得到答案。原创 2024-06-19 19:02:30 · 672 阅读 · 0 评论 -
UVa1310/LA2664 One-way traffic
在每个点双连通分量内,各顶点间双向可达,意味着每个点的出度和入度均非0,那么对这个分量的原始所有有向边做一个遍历可以算出每个顶点的出度入度。然后对于出度入度至少有一者为0且只有一条双向边可选的顶点先处理(此时双向边的改造结果唯一确定)。最后剩下的顶点再依次遍历时,若其出度为0,则可选首条关联无向边改向补偿出度向并对另一端的顶点更新入度即可,这时候可能入度也为0,则继续找第二条边改向。像这样处理后,已经保证了双向可达,但可能仍然有部分无向边没使用到,这些边任意选定一个方向即可。原创 2024-06-05 14:28:00 · 407 阅读 · 0 评论 -
UVa1324/LA2957 Bring Them There
找出图中不同路径不能有重边且路径长度尽量短的所有st路径(跑一次最小费用最大流后,反复从源点s出发沿着有流的正向边走到汇点t就能找出所有最优路径,注意把已经遍历过的边流量清空),将这些路径按长度排序,按长度分层直接可找出最少需要的天数,然后按照长度越短的路径越优先使用的原则构造运输方案即可。原创 2024-05-16 22:10:16 · 1068 阅读 · 1 评论 -
UVa1116/LA2429 Puzzle
本题目其实是要区分哪些边是原凸多边形的外边,哪些边是内边(对角线)。仔细分析选出的对角线互不相交这个条件,就能找到突破口:一定至少有两个顶点的度为2。原创 2024-06-07 11:56:49 · 917 阅读 · 0 评论 -
UVa1516/LA5906 Smoking gun
题目原文已经对sample做了解释,可以想到构建差分约束求解:ti − tj < sqrt((xj−xk)^2+(yj−yk)^2) − sqrt((xi−xk)^2+(yi−yk)^2)。这和一般的差分约束不太一样,一般的差分约束不等式带等号,无解等价于有向图存在负权圈,这里差分约束不带等号,那么0权圈也是无解的。并且本题有解时还需要判断拓扑排序结果是否唯一,考虑顶点数n并不大(2≤n≤100),可以用Floyd算法预处理之后,有0权圈或负权圈(即w[i][i]≤0)则无解,有解时利用dp找最长路。原创 2024-06-17 12:02:53 · 328 阅读 · 0 评论 -
UVa1311/LA2666 Servers
本题其实是Dijkstra加一点优化,可将复杂度优化到𝑂(𝑎𝑛𝑠 log𝑛),但仍然可以出卡O(n^2 logn)的数据导致tle。说一下优化方法:对服务器按rank从大到小排序,记𝑒𝑖为排名比i大的所有结点到i的最小距离,依次枚举排序后的服务器作为Dijkstra求最短路的起点,Dijkstra的松弛条件增加𝑑𝑣原创 2024-06-26 17:34:05 · 383 阅读 · 0 评论 -
UVa1265/LA4848 Tour Belt
首先可以想到如果最大权边唯一,那么其两端点构成的子图是候选子图,否则要看沿两端点延伸的其他边对应的端点是否要包含到候选子图中,找到初始候选子图容易想到将其缩成一点继续迭代,不过这样在本题的数据规模下会超时。仔细分析以上缩点迭代的过程,其实就是边权从大到小排序后求最大生成树(也可以是森林)的过程,当前边合并进来后,检查其所在的连通分量是否满足候选子图的要求然后更新答案计数即可。不过这种做法其实复杂度为𝑂(𝑚𝑛),感觉数据刁钻一点的话也会超时,没想到提交AC了并且才几十毫秒。原创 2024-07-05 12:59:47 · 549 阅读 · 0 评论 -
UVa1466/LA4849 String Phone
满足距离要求的顶点其实可以分成两类(0:左下/右上、1:左上/右下)并且只能选择一类,每类也只能选则一个,可以用二染色+2-SAT解决。还有一个坑点:题目说图保证是连通的,实际上可能不连通,要对各个连通分量单独处理。原创 2024-05-28 22:45:23 · 754 阅读 · 0 评论 -
UVa1321/LA2925 Dice contest
sample数据和uDebug上标程的输出不一致。骰子不管在哪个网格,有24种状态,乘上行数4,总共96,起点到终点的横坐标跨度𝑑𝑥可能很大,考虑稀疏表可将复杂度优化到𝑂(96^3 log𝑑𝑥):记𝑎[𝑦1][𝑠1][𝑦2][𝑠2][𝑖]表示骰子在第𝑦1行状态为𝑠1,翻转到第𝑦2行状态为𝑠2且横向移动量为2^𝑖(1≤𝑦1,𝑦2≤4,0≤𝑠1,𝑠2原创 2024-07-01 12:26:24 · 843 阅读 · 0 评论 -
UVa1327/LA2966 King’s Quest
经典问题:已知二分图的一个最大匹配方案,怎么求其他匹配方案。不过作为婚姻问题,本题只有男方有候选列表,女方被动等待分配结果。可以借助有向图强连通分量的Tarjan算法求解(求出所有scc后,如果某男和某女在同一个scc且可以匹配——此女在某男的候选列表,则两者匹配后,其他男女间仍然存在最大匹配方案),说一下建图方法:利用男方候选列表加单向边𝑥𝑖→𝑦𝑗,利用一个完美匹配的方案加单向边𝑦𝑖→𝑥𝑗。原创 2024-07-11 12:39:42 · 435 阅读 · 0 评论 -
UVa1496/LA5717 Peach Blossom Spring
本人学习icpc算法竞赛时自己对UVa部分题目的解题思路 本题是2011年ACM ICPC 亚洲区域赛 北京 赛区 的E 题。有n个房子(4 ≤ n ≤ 50),前k个房子每个里面住着一户人家k (1 ≤ k ≤ 5, 2k ≤ n),末k的房子是隐蔽点。这些房子间总共有m条道路(0 ≤ m ≤ 1000),但所有道路都是损坏的,每条道路的维修费用是w(1 ≤ w ≤ 1000)。请计算最小的维修费用,使得前k户人家和最后k个避难点一一对应。经典问题:图论中的斯坦纳树。原创 2022-10-11 20:10:46 · 107 阅读 · 0 评论 -
UVa1660/LA3031 Cable TV Network
本题可以用最小割模型建图求解,有意思的是,一开始我想出了直接解法:检测当前图是否只有一个连通分量,若不止一个连通分量则不再需要删点,否则找出要删的点并且删除之,答案计数加1。找出当前要删除的点的贪心想法:找到度最小的点后删除其邻接的度最大的那个点(度最小的点有多个时找他们邻接的度最大的那个点删)。给定一个n(n≤50)个点的无向图,求它的点连通度,即最少删除多少个点,使得图不连通。如下图所示,a)的点连通度为3,b)的点连通度为0,c)的点连通度为2(删除1和2或者1和3)。原创 2024-08-14 20:01:21 · 255 阅读 · 0 评论 -
上下界网络流
上下界网络流的可行流及最大最小流求解,包括:无源无汇有容量上下界网络的可行流、有源有汇有容量上下界网络的可行流、有源有汇有容量上下界网络的最大流、有源有汇有容量上下界网络的最小流原创 2024-08-12 22:29:14 · 717 阅读 · 0 评论 -
二分图匹配灵活运用
本文主要介绍了二分图匹配的灵活运用,包括最小覆盖点方案、增广路算法、最大权匹配、无奇环性质的运用、利用SCC求最大匹配的必须边和可行边以及不同匹配方案的求解方法。通过具体例题和代码实现,展示了二分图匹配在实际问题中的应用和技巧。原创 2024-07-24 13:59:41 · 283 阅读 · 0 评论 -
图论建模技巧搜集
搜集图论建模技巧,建图技巧。原创 2024-07-16 17:50:24 · 524 阅读 · 0 评论