
图论
# 图论
快乐撸代码
一个今天胜过两个明天
展开
-
最短路变形(限制条件)POJ 1724
题意:在一个 n 个点,r 条边的图上, 一个人要从 1 号点走到 n 号点,走的路径有距离还有花费。问花费最多为 k ,最短路程是多少?/** 最短路变形: 在求最短路的情况下,加上限制条件(边的权值有花费 和 长度) 一定花费范围内求最短路 思路: 将图的信息邻接表存储,遍历图时,通过 优先队列(距离小的优先) 把花费能够走到的点(下一个点的编号,从1到该点的距离和花费)放进队列, 由于队列是距离优先,所以第一个遍历到的 n 就是最短原创 2020-09-21 19:17:07 · 289 阅读 · 0 评论 -
HDU-3020-Antenna Placement 二分图最小路径覆盖
二分图最小路径覆盖题意:给出一个n * m的矩形图,* 代表城市,o 代表空地,现有 4 种通讯仪器覆盖方式,覆盖当前点后(还可覆盖相邻的上下左右四个方向中的一个点),求:要想把所有城市都覆盖,最少需要多少仪器?思路:本来是暴力写的,遍历每个点,不知道为什么 WA ,后来才找到这个是最小路径覆盖这个是比较好理解的:首先遍历矩阵图,建图(注意是城市为顶点):遍历所有的城市,为其加...原创 2020-04-25 20:24:10 · 191 阅读 · 0 评论 -
双连通分量 Road Construction POJ - 3352
@双连通分量题意:有一个 n 个点 m 条边的无向图,问至少添加几条边,能让该图任意缺少一条边后还能相互连通。双连通分量定义:在无向连通图中,如果删除该图的任何一个结点都不能改变该图的连通性,则该图为双连通的无向图。一个连通的无向图是双连通的,当且仅当它没有关节点(这里面节点可换成边:分点双连通分量 ,分边双连通分量)。思路:首先缩点成树;与强连通分量缩点有所不同:记录父节点 ,不返...原创 2020-04-06 11:07:28 · 243 阅读 · 0 评论 -
2-SAT(HDU-3062 party)
2-SAT(HDU-3062 party)解决问题类型:**书本定义:**给一个布尔方程,判断是否存在一组解使整个方程为真,被称为布尔方程可满足性问题(SAT)因为本题只有0,1(丈夫 妻子只能去一个人),所以是2-SAT。算法思想:根据题意:对于(a ,a’ )(b ,b’ ),如果a ,b 构成仇恨问题,那么a 若出席,b’ 一定出席,b若出席,a ‘ 一定出席;据此他们之间可以建有...原创 2020-04-02 21:42:05 · 280 阅读 · 0 评论 -
差分约束系统 模板
先来理解一下:有一个已经求好的dis[]最短路数组,有一条边x->y权值为w,那么一定存在dis[y]<=dis[x]+w,即dis[y]-dis[x]<=w;那么什么是差分约束系统呢,就是给我一些不等式,我可以用最短路的思想把他们转化成图(即差分约束系统),然后加一个超级原点0,0到其他所有点的地方初始化为0以后,去求最短路,如果存在负权回路,说明无解,否则求出了一组解。但...原创 2020-02-22 09:28:25 · 188 阅读 · 0 评论 -
HDU - 2444 二分图最大匹配 之 判断二分图+匈牙利算法
题意:第一行给出数字n个学生,m条关系,关系表示a与b认识,判断给定数据是否可以构成二分图,如果可以,要两个互相认识的人住一个房间,问最大匹配数(也就是房间需要的最小数量)思路:要看是否可以构成二分图,就是二分图的判断,这里主要记录一下自己想的判断方法:用一个数组记录分类,0表示这个人没有被分类,1,2表示二分图两个部分,边输入边判断是否是二分图,如果两个人都是0,那么将这两个人分别赋值1,2...原创 2020-01-30 15:51:21 · 259 阅读 · 0 评论 -
CodeForces - 1006F (深搜从两端向中间搜,省时)
题意:输入n,m,k,给出一个n*m的图,里面有权值,从1,1一路异或到n,m,只能向右或向下走,等于k有多少种路径。思路:一开始就是直接暴力写个深搜,稳稳的超时,分析一下时间复杂度。每个点有两个方向,如果真的给20*20的图,最起码到对角线的时候,复杂度已经是2^20左右了,继续往下,因为边界问题,越界不走,所以每次深搜只是少搜两个点,一定超时。所以从两个端点往中间走,第一次深搜,从1,1向...原创 2019-12-15 21:34:18 · 181 阅读 · 0 评论 -
割点和图(割边)
割点: 在连通的无向图中,删除一个点和与它所相连的边,无向图不再连通,说明这个点是割点。思路: 从一个点开始深搜,当这个点不经过他的父亲节点不能返回到比这个父节点更早的时间戳,说明这个点的父节点是割点。low[v]>=dfn[u]注意: 判断割点时分两种情况,如果父节点是根节点的话,至少两个儿子才能形成割点!割边就是去掉一条边使这个图不连通。low[v]>dfn[u];不能经...原创 2019-11-22 20:06:17 · 259 阅读 · 0 评论 -
Tarjan算法(模板)
算法思想: 首先要明确强连通分图的概念,一个有向图中,任意两个点互相可以到达;什么是强连通分量?有向图的极大连通子图叫强连通分量。给一个有向图,我们用Tarjan算法把这个图的子图(在这个子图内,任意两个点可以相互到达,极大的子图)缩成一个点,相当于化简;怎样去做:从一个点开始遍历(dfn记录时间戳,low记录能回到的最早的时间戳),每遍历到一个点,判断是否...原创 2019-11-22 19:22:39 · 277 阅读 · 0 评论 -
POJ 1797 最短路变形所有路径最小边的最大值
题意:卡车从路上经过,给出顶点 n , 边数 m,然后是a点到b点的权值w(a到b路段的承重),求卡车最重的重量是多少可以从上面经过。思路:求所有路径中的最小的边的最大值。可以用迪杰斯特拉算法,只需要将模板的路径更新那改一下,具体看代码注释。注意:数组的初始化为-1或零m因为题意说的权值并不是距离,而是路的承重。代码如下:#include<stdio.h>#incl...原创 2019-07-30 20:54:37 · 523 阅读 · 0 评论 -
POJ - 3255 SPFA+邻接表求次短路径
题意:给出m条边 , n个顶点,u[ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度.思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举每段路径不存在的时候的最短路径,求最小值。不过这道题数据太大,邻接矩阵存不下,听说用单源最短路径会超时,所以用邻接表存,用SPFA算法求1号点到其他所有点的最短路径,再用一次SPFA求出n号点到所有...原创 2019-07-29 21:42:04 · 257 阅读 · 0 评论 -
dijskra算法(求正权图中最短路)
思想:每次找到离原点最近的顶点,以这个点为中心扩展松弛,更新其余点到原点的最短路径.注意:if(e[u][v]>x)e[u][v]=x;book[ ]数组标记最短路程的顶点集合#include<algorithm>#include<stdio.h>#include<string.h>#include<iostream>#d...原创 2019-11-05 14:03:15 · 1391 阅读 · 0 评论 -
最小生成树(次小生成树)(最小生成树不唯一) 模板:Kruskal算法和 Prim算法
Kruskal模板:按照边权排序,开始从最小边生成树#include<algorithm>#include<stdio.h>#include<string.h>#include<iostream>#define N 1000+5//n 个顶点,m条边using namespace std;//最小生成树模板(计算最小生成树的sum)...原创 2019-11-04 21:22:13 · 894 阅读 · 0 评论 -
关于欧拉回路和欧拉道路
从一个点开始走欧拉回路,不重复走边可以把所有的边走一遍,并且回到出发点。而欧拉通路则不需要回到原点。1、欧拉道路:大前提是一个连通的基图,具有2个(一定以这两个点为端点)或者0个奇度节点,一定是欧拉通路。(无向图)2、没有奇度节点的连通图是欧拉回路(无向图)欧拉回路可以通过简单的深搜得到路径。对于有向图:1、所有点的出入度相等(欧拉回路)或者有两个点出入度之差一个为1(起始点),另...原创 2019-07-30 21:14:39 · 1002 阅读 · 0 评论 -
HDU - 1317 ~ SPFA正权回路的判断
题意:有最多一百个房间,房间之间连通,到达另一个房间会消耗能量值或者增加能量值,求是否能从一号房间到达n号房间。看数据,有定5个房间,下面有5行,第 iii 行代表 iii 号 房间的信息,第一个数字表示从此房间到达连接的房间得到的能量,第二个数字表示连接的有几个房间,后面输出房间后。思路: 正向去模拟,求出到达n点后尽可能的让dis[n]的值更大 , dis[1]初始化为100,其他初始化...原创 2019-08-03 21:24:44 · 198 阅读 · 0 评论 -
HDU - 1962 二分图最大匹配模板(扑克牌得分最大)
题意:直接说数据,第一行给定几组数据,每一组数据的第一行是两个人扑克牌分别的数量,第一行是亚当的扑克牌,第二行是夏娃的扑克牌,每一个扑克牌的大小用两个字符来表示,第一个表示是几号扑克牌,第二个表示扑克牌的花色(题中有给)思路:这是二分图最大匹配的模板题,二酚涂最大匹配需要用一个数组来记录匹配的路径。这里面是数组a,首先需要判断这两行的扑克牌互相之间的大小关系。然后以亚当手里的扑克牌为基准,枚...原创 2019-08-04 17:57:06 · 247 阅读 · 0 评论