图论
多行不译必自闭
人生如逆旅,我亦是行人
展开
-
最短路 +网络流 -- Marriage Match IV HDU - 3416
Marriage Match IV HDU - 3416题意:给你一张节点为n、边数m的为有向图,每条边只能走一次,问该图的最短路有几条。思路:显然,我们先要找出所有与最短路有关的边,再建图跑最大流。关键是如何找出所有与最短路有关的边,对于这张有向图我们正向、反向各建一遍,用spaf算法各跑一遍最短路。那么与最短路有关的边满足 w + dis1[u] + dis2[v] = min_dis,即一条边的权值 + 源点到该边的前继节点u正向最短路 + 汇点到该边的后驱节点v的反向最短路 = 源点到汇点的原创 2020-10-11 14:29:18 · 118 阅读 · 0 评论 -
二分 + 网络流 -- Marriage Match II HDU - 3081
Marriage Match II HDU - 3081题意:输入n, m,f。表示有n个女生和n个男生,m行u, v表示编号u和v的女生和男生可以结婚,f行u,v表示编号为u,v的女生相互是朋友,朋友关系具有传递性,对于女生来说朋友的结婚对象也可以是她的结婚对象,问可以有多少中不同的结婚组合方式。思路:简单来说这里是要求最大匹配数,对女生和可以和她结婚的男生连边,权值设为1,然后二分源点到女生的边的权值,权值表示每个女生最多可以与多少个男生结婚。跑最大流判断是否满足。code:#inclu.原创 2020-10-10 21:49:13 · 143 阅读 · 0 评论 -
状压 + 网络流 -- Escape HDU - 3605
Escape HDU - 3605题意:n个人移民到m个球上,对于每个人来一些星球是他可以移居的,有些不可以,每个星球的承载能力也是有限度的,问n个人是否可以全部完成移居。n是1e6级别的,m是1e1级别的。思路:显然是网络流或二分匹配(其本质都是找增广路),我们这里选择网络流解决,但n 是1e6级别的,以人为节点建图跑网络流显然会超时,然而我们注意到m是1e1级别的,我们可以以人们对m个星球的移居状态来状态压缩,10个星球,所有的状态组合也只有2^10 = 1024,那么有状态组合为节点来建图完全原创 2020-10-09 23:54:50 · 3956 阅读 · 0 评论 -
网络流最小割 -- Control HDU - 4289
Control HDU - 4289题意:在一张双向交通网络图中,在交查路口都要安排一个警察来监视,每个路口警察都有不同的花费,要求监视到所有的车辆人员,求最小花费。思路:其实这里利用网络流的流量是其路径上的最小容量限制的(即我们说的割),用网络流来找到最小花费,我们拆点为边,把点拆为入点和出点,把放置警察的花费作为边的容量,道路是双向的,从一个点的出点到另一个点的入点,容量设置为无穷inf建图跑网络流就可以了。code:#include<iostream>#include&l原创 2020-10-08 14:07:55 · 135 阅读 · 0 评论 -
网络流isap算法 -- Island Transport HDU - 4280
Island Transport HDU - 4280 题意:给一张图,求最大流思路:isap算法模板code: #include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>using namespace std;const int maxn = 1e5 + 5;str原创 2020-10-04 14:58:32 · 140 阅读 · 0 评论 -
最小费用最大流 | 二分图HK算法 -- Going Home POJ - 2195
Going Home POJ - 2195题意:在 n * m的矩阵上有 k个人和k所房子,一所房子只能待一个人,人可以上下左右的移动,求让每个人都走到房子里的最小总步数,注意可以经过房子所在的格子不进入房子。思路:跑最小费用最大流,人到房子的距离为边权,人房边的容量为1建图,再建立超级源点0连接每个人,边权为0, 边的容量为1,建立超级汇点201连接没所房子,边权为0,边的容量为1,用最大流限制人和房子的一一对应关系,同时用一边权跑最短路,每次找到一条最短路,直到跑完最大流。#include&l原创 2020-10-02 21:04:49 · 456 阅读 · 0 评论 -
一般图最大匹配模板 -- 带花树
问题:对于一个图G(V,E),它的匹配M是二元组(u,v)组成的集合,其中u,v∈V,(u,v)∈E,并且M中不存在重复的点。当|M|最大的时候,我们称M为G的最大匹配。当G是一个二分图的时候,它的最大匹配可以用经典的匈牙利算法或网络流算法求解。然而当G是一个一般的图时,直接进行增广就变得不可行了,例如下面这个例子:这个问题出现的原因,就是一个一般图中会含有奇环,即一个点数为2k+1,k>0的环,而如果经过一个奇环,那么会得到两条含有同一个点的匹配边,这其实是不符合定义的。那为什么二分图可以原创 2020-08-24 15:20:19 · 179 阅读 · 0 评论 -
二分图 最佳匹配 KM算法模板 -- HDU 2255 奔小康赚大钱
HDU 2255 奔小康赚大钱题意:n个村民重新分配n间房子,接下来n行表示,第i个村民对第j个房子出的价格,问怎样才能使村里的机构获得最大收入。思路:KM算法模板。KM算法详解:https://www.cnblogs.com/fzl194/p/8848061.htmlhttps://www.cnblogs.com/fzl194/p/8834847.htmlcode:#include<iostream>#include<cstdio>#include<c原创 2020-08-19 21:42:50 · 266 阅读 · 0 评论 -
二分 + 多重匹配 / 网络流 -- POJ2112 Optimal Milking
POJ2112 Optimal Milking题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用;并告诉了产奶机、奶牛之间的两两距离Dij(0<=i,j<K+C)。如何安排使得在任何一头奶牛都有自己产奶机的条件下,奶牛到产奶机的最远距离最短?最短是多少?思路:二分答案,这里可以用二分图的多重匹配判断,也可以建图跑网络流。二分 + 多重匹配#include<iostream>#include<cstdio>#include<cstdlib原创 2020-08-17 16:20:36 · 120 阅读 · 0 评论 -
二分 + 多重匹配 -- POJ - 2289 Jamiemeigeren‘s Contact Groups
POJ - 2289 Jamie’s Contact Groups题意:有n个人,分为m组,每个可以被归到一些组里,但最终每个人只能归到一个组,求人数最多组的人数最少是多少。思路:二分人数,多重匹配判断。多重匹配:右边的组可以匹配多个左边的人。当每组的人数不够mid的话直接匹配就行。 若已经达到mid,那么看是是否还能寻找到增广路,若能找到就进行替换。code:#include<iostream>#include<cstdio>#include<cstdli原创 2020-08-16 23:06:52 · 432 阅读 · 0 评论 -
二分专题 最小可重复路径点覆盖 -- HDU1151 Air Raid
HDU1151 Air Raid题意:给你一个有向无环图,选择一些人(可以从任何点出发),问最少需要多少人可以走遍所有节点。即求出最少的路径将所有点覆盖至少一次。思路:最小可重复路径点覆盖 = 点数 - 最大匹配数,要用floyd求闭包,在跑匈牙利求最大匹配。code:#include<iostream>#include<cstdio>#include<cstdlib> using namespace std;const int maxn = 1原创 2020-08-16 13:47:26 · 260 阅读 · 0 评论 -
最小点覆盖 -- HDU 1054 Strategic Game
HDU 1054 Strategic Game题意:给你一个n个节点的多叉树,士兵站在节点上,问你至少要多少士兵就能监视多叉树上的所有边。思路:最小点覆盖裸题,最小点覆盖 = 二分图最大匹配。code:#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;const int maxn = 1505;struct edge{ int u, v, next;} g原创 2020-08-15 17:06:13 · 131 阅读 · 0 评论 -
有向无环图(DAG)的最小路径覆盖(最小不相交、最小相交)
DAG的最小路径覆盖定义: 在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖。最小不相交路径覆盖: 每一条路径经过的顶点各不相同。如图,其最小路径覆盖数为3。即1->3>4,2,5。最小可相交路径覆盖: 每一条路径经过的顶点可以相同。如果其最小路径覆盖数为2。即1->3->4,2->3>5。特别的,每个点自己也可以称为是路径覆盖,只不过路径的长度是0。DAG的最小不相交路径覆盖:算法: 把原转载 2020-08-14 15:00:42 · 1353 阅读 · 0 评论 -
二分图论总结 -- 最大匹配、最小点覆盖、最少边覆盖、最大独立集
https://blog.csdn.net/qq_41730082/article/details/81456611https://blog.csdn.net/huangshuai147/article/details/51087275/转载 2020-08-14 13:25:58 · 224 阅读 · 0 评论 -
dfs + 最短路 -- 6797 Tokitsukaze and Rescue
6797 Tokitsukaze and Rescue题意:给你一张n个节点的完全图, 去掉k条边使图的最短路最大,求这个最大值。思路:边权随机的情况下,最短路的边数很少。所以只要每次跑一下最短路,抓一条最短路出来,枚举删除最短路上的哪条边,然后递归,变成删 除 (k−1) 条边的子问题。 重复这过程直到 k = 0,然后再跑一次 1 到 n 最短路,把结果取 max 即可。 复杂度 O(n2 ∗ck),c 为最短路边数题意:#include<bits/stdc++.h>us原创 2020-07-29 16:47:30 · 225 阅读 · 0 评论 -
并查集 + 链表 -- G Operating on a Graph
G Operating on a Graph题意:给一个 n 个点的 Graph,第 i 个点一刚开始是第 I 种颜色,接着有 k 次 操作,第 i 次操作有个参数 oi 代表颜色 oi 会侵略所有和自己相邻的颜色, 于是所有和 oi 相邻的颜色全都变成 oi (若已没有颜色oi 已被侵略,则该次 操作无效),求最终每个点的颜色。思路:重要观察:在所有操作过程中,对于每个点,至多只会有一次把相邻的点和 自己变为同一种颜色的操作,经过该次操作后,就永远和相邻的点同色了。对于每个颜色都维护一个点的原创 2020-07-19 16:57:18 · 298 阅读 · 0 评论 -
二分匹配 -- Swap HDU - 2819
Swap HDU - 2819思路:#include<cstdio>#include<cmath>#include<iostream>using namespace std;const int maxn = 1e2 + 5;bool vis[maxn];int mp[maxn][maxn], match[maxn];int n;pair<int, int> pai[maxn * 2];bool dfs(int u){ for(int原创 2020-07-16 15:11:06 · 113 阅读 · 0 评论 -
二分匹配 -- The Accomodation of Students HDU - 2444
The Accomodation of Students HDU - 2444思路:染色判断二分图,二分图求最大匹配裸题。code:#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>using namespace std;const int maxn = 2e2 + 5; struct node{ int u原创 2020-07-07 11:09:36 · 121 阅读 · 0 评论 -
LCA + 连通图 -- Network POJ - 3694
Network POJ - 3694 思路:code:#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstdlib> using namespace std;const int maxn = 1e5 + 5;struct node{ int u, v, next;} g[maxn];int head[maxn],原创 2020-07-05 22:21:28 · 113 阅读 · 0 评论 -
树的直径 + 强联通分量 -- Warm up HDU - 4612
Warm up HDU - 4612DCC缩点后建立一棵树, 树中的所有边都是桥。 任意连接一条边使桥的数量最少。 那么就是要找出树的最长路径–树的直径。ans = 桥的数量 - 树的直径#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespac原创 2020-07-04 22:23:59 · 148 阅读 · 0 评论 -
填边判强连通 -- Strongly connected HDU - 4635
Strongly connected HDU - 4635思路:code:莫名bug,找了一天心累了,懒得找了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;struct node{ int u, v, next;}g[maxn];int head[maxn];int dfn[maxn], l原创 2020-07-04 08:45:47 · 149 阅读 · 0 评论 -
联通图 压环成点 -- Caocao‘s Bridges HDU - 4738
Caocao’s Bridges HDU - 4738 思路:用targan算法找出图的强连通分量,并压缩成点,生成新图,便利新图找到最小边权即可。注意:图本身可能就不连通,此时就不需要派人,答案为0。当最小边权为0,派一个人即可,答案为1。code:#include<iostream>#include<algorithm>#include<cmath>#include<stdlib.h>using namespace std;const原创 2020-07-02 14:40:45 · 202 阅读 · 0 评论 -
无向图求割边(即桥)-- Critical Links UVA - 796
Critical Links UVA - 796割边:类似于割点连接图的部分,若去掉割边图就会被分割为两部分。判断条件:一条边(u,v)是桥当且仅当满足(u,v)为树枝边,且Low[v]>DFN[u]。注意:由于是无向边,要排除掉返祖边的影响(即一个点的字节点不能是父节点)。code:#include<iostream>#include<algorithm> #include<stdio.h>#include<stdlib.h>#inc原创 2020-05-19 14:56:28 · 289 阅读 · 0 评论 -
无向图求割点 -- Network UVA - 315
Network UVA - 315割点:连接图各个部分的关键点,若删除整个图将会被分割为若干部分。无向图求割点思路:1.如果是头节点连接了若干个强连通分量,那么他就是割点。2.如果满足low[v]>=dfn[fa[v]],那么这个点的父节点 也就是fa[v]就是割点。code:#include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include原创 2020-05-18 16:26:27 · 273 阅读 · 0 评论 -
强连通分量 -- Network of Schools POJ - 1236
Network of Schools POJ - 1236题意:给你一张有向图,第一问时从一些点出发能到达图的每一点,求出发点的最少数量。第二问是在某些点间连边使整张图变成一个强连通图,求最少的连边数。思路:先把图中的强连通分量缩成点重新构图,第一问是求新图入度为零的点的数量,第二问是求新图的 max (入度为零的点数,出度为零的点数)。code:#include<iostream>#include<algorithm>#include<stdio.h>原创 2020-05-17 22:09:32 · 124 阅读 · 0 评论 -
无向图最小生成树计数模板 -- Minimum Spanning Tree HDU - 4408
思想:最小生成树计数用到了Matrix-Tree定理和贪心、分块思想,Matrix-Tree定理用来求出每个分块的每个联通块的方案数,分块是指按权值给边划分区块。关于分块:因为我们求得是最小生成树有多少种的组成方案。最小生成树的总权值是一个定值,不会有比原最小生成树更小的边权,也不能把比生成树中大的权边来作为替换边(那样总权值就不最小了),所以只能是权值相等的边相互替换。关于分块我们要引进 ...原创 2020-04-07 10:01:35 · 245 阅读 · 0 评论 -
无向联通图生成树计数 -- Lightning HDU - 4305
Lightning HDU - 4305题意:有n个机器人在二维平面上, (x, y)表示机器人所处的位置(位置不重复),一道是闪电会打到一个机器人身上,闪电会传导到与该机器人距离不大于r的机器人上面(但闪电不会隔着一个或几个机器人传导),每个机器人传导同理,问可以有多少种闪电纹路,如果有机器人没有被覆盖则输出-1。思路:无向联通生成树计数题,两个机器人距离不超过r就联通,把无向图处理出来...原创 2020-04-04 12:42:40 · 223 阅读 · 0 评论 -
无向图生成树计数 -- Join URAL - 1627
Join URAL - 1627题意:在一个n * m的矩阵里 * 表示厨房, . 表示卧室,要把所有卧室之间用门连接起来,问有多少种连法,只能是两卧室之间直接相连,不能通过厨房间接相连。(n, m小于10)思路:先把 . 表示的卧室按时间戳编号,直接相邻的卧室看作一条无向图的边,建立无向图图,接下来就是生成树计数问题了,用Kirchhoff 矩阵法求出无向图有多少种生成树。code:...原创 2020-04-03 18:03:27 · 328 阅读 · 0 评论 -
无向图生成树计数 -- Kirchhoff 矩阵法模板
作用:给定一个n个点m条边的无向图,求出这个图的生成树的总数。Matrix-Tree定理(Kirchhoff 矩阵-树定理)1、G 的度数矩阵 D[G]是⼀个 n*n 的矩阵,并且满⾜:当 i≠j 时,dij=0;当 i=j 时,dij 等于 vi 的度数。2、G 的邻接矩阵 A[G]也是⼀个 n*n 的矩阵, 并且满⾜:如果 vi、vj 之间有边直接相连,则 aij=1,否则为 0。我...转载 2020-04-02 20:14:43 · 526 阅读 · 0 评论 -
强连通分量 -- Tarjan算法
什么交强连通分量:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。如图:图二就是图一的强连通分量。dfn 、low数组:dfn[ ]:就是一个时间戳(被搜到的次序),一旦某个点被...转载 2020-03-31 20:33:04 · 269 阅读 · 0 评论 -
生成树最小树形图 -- 朱刘算法详解
本文借鉴的博文:zephyr_pro dalao的blog朱刘算法引入:(把一道最小树形图当作最小生成树来做了,wa了后以为是bug像个sb一样d了半天)最小树形图和最小生成树都是要求总权值最小,但区别四一个有向、一个无向。有向的最小树形图是不能用prim 或krustra算法来求解的。why?因为prim 或krustra算法只能适用无向图的环,不能适用有向图的环。举个例子,如图:...原创 2020-03-27 12:16:09 · 1687 阅读 · 1 评论 -
次小生成树 -- Is There A Second Way Left? UVA - 10462
Nasa, being the most talented programmer of his time, can’t think things to be so simple. Recently allhis neighbors have decided to connect themselves over a network (actually all of them want to sha...原创 2020-03-25 18:18:34 · 135 阅读 · 0 评论 -
次短路 优先队列优化 -- Qin Shi Huang's National Road System HDU - 4081
Qin Shi Huang’s National Road System HDU - 4081 题意:出N个点的坐标以及每个点的人口, 要求将这N个点通过N-1条边连接起来, 权值为两点直接距离, B为距离和, 同时可以选中一条边, 使得该边权值变为0, A为该边两点人口数量. 求A/B的最大值思路:题目要求A / B最大,A是相邻两座城市的总人口数,B是除该相邻城市之间的权值最短路,遍历...原创 2020-03-24 18:42:24 · 156 阅读 · 0 评论 -
次小生成树模板
次小生成树模板题: The Unique MST POJ - 1679prim & Kruskal 次小生成树思路:这两种算法的思路都是相同的,首先求出最小生成树,我们枚举每条不在最小生成树上的边,并把这条边放到最小生成树上面,然后就一定会形成环,那么我们在这条环路中取出一条最长的路(除了新加入的那一条边)。最终我们得到的权值就是次小生成树的权值。prim次小生成树:我们在求解次小...原创 2020-02-20 13:41:23 · 92 阅读 · 0 评论 -
bfs建图 & 最小生成树 -- Borg Maze POJ - 3026
Borg Maze POJ - 3026思路:从s出发(看作有很多人)意思可以从多个方向走,去寻找到达A的最短路径。如找到一个A,那么可以从当前位置出发这时候步数又为0了,又去寻找其他的A。也可以直接暴力求解每个字母到达其他字母的路径进行建图,就从每个字母出发,进行多次BFS求解即可。code :#include <cstdio>#include <cstring&...转载 2020-02-19 18:43:29 · 193 阅读 · 0 评论 -
最小生成树模板题 -- Jungle Roads POJ - 1251
Jungle Roads POJ - 1251题意:有n个村庄由一些道路连接,每条道路有维护成本,求任意村庄两两相连时所需的最小维护成本。input输入包括多组数据,最多100组,最后以输入0表示结束。对于每一组数据,第一行一个n,表示景区数量。1<n<27之后n-1行,每行第一个是一个大写字母,表示当前村庄的编号,接着是k,表示当前景区对外可以有k中线路制造方式,接着k...原创 2020-02-18 17:45:07 · 146 阅读 · 0 评论 -
并查集小结
并查集分类:普通并查集带权并查集种类并查集并查集 + dp可持续化并查集普通并查集How Many Tables HDU - 1213 思路: 求连通块的个数code:#include<iostream>#include<set>using namespace std;const int maxn = 1e3 + 5;int f[max...原创 2020-02-18 11:26:24 · 154 阅读 · 0 评论 -
贪心 & 并查集压缩路径 -- Supermarket POJ - 1456
Supermarket POJ - 1456题意:是买卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,而每个单位时间只能买一件。问最大获利。思路:用贪心做,用并查集来加快速度,太精妙了。如果购买不冲突,那么全部买下来就可以了。存在冲突,就需要取舍。显然在冲突的时候我们选择价格高的更优,如此就可以用贪心的算法。先将物品按照价格从高到底的顺序排列,购买一个就在时间点上做一个标记,...原创 2020-02-17 10:02:50 · 113 阅读 · 0 评论 -
最短路 : 差分约束 -- Layout POJ - 3169
Layout POJ - 3169题意: 有 N 头奶牛正在排队,它们的编号为 1 到 N,约翰要给它们安排合适的排队位置,满足以下条件:• 首先,所有奶牛要站在一条直线上。由于是排队,所以编号小的奶牛要靠前,不能让编号大的奶牛插队。但同一个位置可以容纳多头奶牛,这是因为它们非常苗条的缘故• 奶牛喜欢和朋友靠得近点。朋友关系有 F 对,其中第 Ai 头奶牛和第 Bi 头奶牛是第 i 对...原创 2020-02-15 12:40:03 · 271 阅读 · 0 评论 -
最短路 & 最大流 -- Marriage Match IV HDU - 3416
Marriage Match IV HDU - 3416 题目大意:让你找出有多少条没有交集的最短路。思路:先用spfa找出可行的边,然后给每条可行的边加上容量1.即表示这条边只能走一次。接下来跑一遍ISAP就可以得出答案。关于判断边可行的方法如下。先从头跑一遍spfa,得到起点到其他所有点的最短路径dis1再从尾跑一遍spfa,得到终点到其他所有点的最短路径dis2对于边u-v w...原创 2020-02-13 18:46:35 · 142 阅读 · 0 评论