
图论
文章平均质量分 78
图论
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
图论基础之图的存储 (邻接矩阵 邻接链表的静态实现、动态实现 邻接数组)
邻接矩阵邻接链表原创 2020-07-06 15:57:42 · 414 阅读 · 1 评论 -
最小生成树 (Kruskal算法、Prim算法)
二维偏序一维偏序问题,就是排序指标只有一个。二维偏序问题,也就是排序指标有两个。比如说,在下图中,问有哪些点的横坐标x,纵坐标都比(6,3)要小,实际上就是问...原创 2020-02-05 21:20:52 · 190 阅读 · 0 评论 -
最短路+Dijkstra算法(小根堆优化)+Bellman—Ford算法(优先队列优化的SPFA算法)+最短路的路径打印+Floyd算法+传递闭包
SSSP问题给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。Dijkstra算法时间复杂度 O(m∗log(n)){{O(m*log(n))}}O(m∗log(n))#include<stdio.h>#include<...原创 2020-02-14 00:04:24 · 416 阅读 · 0 评论 -
二分图的概念、判定、最大匹配
文章目录二分图的定义二分图的判定定理二分图的判断准则二分图的定义如果我们能将一个无向图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。或者说:如果一个无向图的N个节点(N>=2)可以分成V1V1V1,V2V2V2两个非空集合,其中① V1∩V2=∅V1\cap V2 = \emptyV1∩V2=∅② 同一集合中的两个点之间没有边相连。那么称这个无向图是一个二分图。二分图的判定定理一张无向图是二分图 ⟺ 图原创 2021-06-19 20:55:49 · 296 阅读 · 0 评论 -
欧拉路、欧拉回路的概念及判定算法
文章目录欧拉路问题欧拉路欧拉回路欧拉路的存在性判定欧拉图(欧拉回路的存在性)的判定欧拉路问题欧拉路问题——一个关于欧拉路给定一张无向图,若存在一个从节点S到节点T的路径,经过每条边一次且仅经过一次(节点可以重复经过),则称路径为S到T的欧拉路。欧拉回路特别地,若存在一条欧拉路,并且这条欧拉路的起点和终点是同一个起点,则称该路径为欧拉回路。欧拉路的存在性判定一张无向图的中存在欧拉路,当且仅当无向图连通,并且图中恰好有两个节点的度数为奇数,其他节点的度数都是偶数。这两个度数为奇数的节点就是欧拉路原创 2021-06-19 20:40:01 · 1352 阅读 · 0 评论 -
AcWing 861. 二分图的最大匹配 (裸题) 匈牙利算法
861. 二分图的最大匹配#include<bits/stdc++.h>using namespace std;const int N = 510;// 邻接数组存储图vector<int> es[N];// 判断某个点有没有考虑过bool st[N];// 记录某一个半部的匹配节点int match[N];int n1, n2, m;bool find(int x){ for(int y:es[x]){ if(!st[y]){原创 2021-03-24 22:41:03 · 111 阅读 · 0 评论 -
UVA-10305Ordering Tasks ——拓补排序(DFS实现、队列实现)
Ordering Tasks #include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<algorithm>#include<stac...原创 2020-06-17 01:29:16 · 137 阅读 · 0 评论 -
经过k个中转点的最短路+DFS(全排列的枚举)
Description:给定一个n个点,m条边的有向图,有k个中转点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。以3个中转点为例,即为k1,k2,k3。一共有6种可能:① s -> k1 -> k2 -> k3 -> e② s -> k1 -> k3 -> k2 -> e…………⑥ s -> k3...原创 2020-03-10 19:58:52 · 578 阅读 · 0 评论 -
POJ - 3764The xor-longest Path——异或运算+Trie+树的DFS遍历
The xor-longest Path大方面的思路:①挑取树的任一节点作为根节点,计算出从其它所有节点 x 到根节点的距离,记为 d[x]。②那么题目中求的 x到y路径上的所有权值异或起来的结果就是 d[x] xor d[y]d[x] \ xor\ d[y]d[x] xor d[y]为什么呢?首先,异或运算的一条性质,a xor&nb...原创 2020-03-05 21:59:56 · 1659 阅读 · 0 评论 -
(嵌套矩形)DAG上的动态规划(1)最长路及其字典序+dfs版(填表法)+递推版(刷表法)
Description:有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。Input:11012 1...原创 2020-03-01 21:56:32 · 372 阅读 · 0 评论 -
最小生成树的建模+POJ - 1789Truck History
Truck HistoryDescription:给定N个字符串,每个字符串都继承于另一个字符串(除了祖先字符串),某个字符串转为另一个字符串的花费为他们每一位不相同的字符数。 求最小花费Q。字符串与字符串之间的关系正是点与点之间的关系,每一位不相同的字符数就是边权,最终每个点都要有父节点(树的连通性),不能多继承(无环性)。注意:不要用c++的cin输入流,和string,速度太慢了...原创 2020-02-28 21:49:20 · 189 阅读 · 0 评论 -
最小瓶颈生成树(POJ - 2349Arctic Network)
思路:求最小生成树的时候记录下每一条边,然后逆序排序,然后跳出第s的边,相当于前(s-1)大的边免费。Arctic NetworkPrim算法:Solution1:#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string...原创 2020-02-28 21:19:54 · 278 阅读 · 0 评论 -
(对新手极其友好)MST最小生成树入门问题
还是畅通工程裸的模板题。#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<algorithm>#define ll long lo...原创 2020-02-28 13:16:33 · 258 阅读 · 0 评论 -
UVA - 1060次小生成树模板题 ACM Contest and Blackout
ACM Contest and Blackout另一道模板题题解#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<algorithm>...原创 2020-02-26 17:11:29 · 138 阅读 · 0 评论 -
无根树转换为有根+树的深度
#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<algorithm>#include <queue>#define ...原创 2020-02-26 16:30:33 · 216 阅读 · 0 评论 -
UVA-1395+苗条生成树+变形Kruskal算法
Slim Span Definition Of Slim Span最苗条生成树的定义:生成树的中最大边与最小边的差值尽可能小。要求:①首先必须是一棵树。②目标值是差值最小。思路:朴素的想法就是暴力枚举所有可能的“苗条度最小生成树”,更新苗条度值即可。时间复杂度:O((m-n)m*logm)注意到,n≤100,所以这个时间复杂度是可以容忍的。其他细节在注释里。#include&l...原创 2020-02-25 20:27:44 · 226 阅读 · 0 评论 -
最短路计数的变式+记忆化搜索———Walk Through the Forest UVA - 1091
Walk Through the Forest 要点:He considers taking a path from A to B to be progress if there exists a route from B to his home that is shorter than any possible route from A.也就是 dis[B]<dis[A]{{dis[...原创 2020-02-20 19:15:53 · 138 阅读 · 0 评论 -
UVA 11374 两次最短路+暴力枚举+路径输出+输出要细致
Airport Express核心思路:因为特殊路线最多只能走一次。因此,对”经济路线“建图,如果有一条"商业路线"(u,v,w)加入到路径的话,那么,从s -->u ,v–>e的路径应该分别是最小值。所以,分别维护两个数组 d[i],g[j],意义分别为从s -->i, j–>e的最短路径。运行两次Dijkstra即可。然后枚举每一条”商业路线“,更新即可。...原创 2020-02-20 01:53:11 · 206 阅读 · 0 评论 -
最短路不唯一,枚举与计数
文章目录最短路唯一的路径记录最短路不唯一枚举所有的最短路计数最短路唯一的路径记录核心就是维护一个 f[]数组,用来记录f[v]=u,也就是v的上一个节点是u。最后既可以递归打印,也可以存进vector,最后循环输出。 /* for(int y=1;y<=n;y++){ d[y]=min(d[y],d[x]+a[x][y]); //必须是a[x...原创 2020-02-19 23:17:33 · 465 阅读 · 0 评论 -
次小生成树+最小生成树是否唯一
TheUniqueMSTDescription:判断最小生成树是否唯一,如果唯一,输出最小代价和;如果不唯一,输出”NOT“。思路:①先生成一棵最小生成树,得到最小代价。②然后扫描MST的每一条边,然后判读如果少了这一条边,再生成一棵树(也有可能无法生成,因为有些边是不可缺少的,需要判断),那么对这些新生成的树的代价和进行判断。即可生成次小生成树,判断MST是否唯一。时间复杂度:O(m...原创 2020-02-19 08:58:15 · 479 阅读 · 0 评论 -
变换开关次数——变形Floyd算法 POJ 1847
变换开关次数本题当然也可以不用Floyd算法(Dijkstra算法),但是N很小,用Floyd算法编码方便。注意点:初始化,无需变动开关的 d[i][j]=0,需要变动的d[i][j]=1 ,不连通的d[i][j]=INF。#include<stdio.h>#include<iostream>#include<cmath>#include<m...原创 2020-02-18 13:51:04 · 189 阅读 · 0 评论 -
欧氏距离的边权、建图复杂 POJ 1847
建图复杂要小心稠密图,使用时间复杂度为O(n^2)的Dijkstra算法。坑点:建图复杂要小心。都是地铁站,但是只能一站一站的前行,不能因为都是地铁站,就可以从1号直接到3号。#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<st...原创 2020-02-18 13:41:39 · 180 阅读 · 0 评论 -
最短路 思维转换 POJ 3159需要深刻理解题意的模板题
CandiesDescription:在幼儿园的时候,Flymouse是班上的班长。有时班主任会给班上的孩子们带来一大袋糖果,让他们分发。所有的孩子都非常喜欢糖果,经常比较他们和别人买的糖果的数量。一个孩子A可以有这样的想法,尽管可能是另一个孩子B在某些方面比他好,因此他有理由比他应得更多的糖果,但无论他实际得到多少糖果,他都不应该得到比B少的一定数量的糖果,否则他会感到不满意。 Flymou...原创 2020-02-17 19:16:30 · 237 阅读 · 0 评论 -
偏序关系的传递闭包(Floyd算法的变种) POJ3660 能够确定排名的个数
Cow Contest Solution:①Floyd算法传递闭包,确定若干对二元关系。注意是有向图,d[x][y]=1表明 x的值>y的值;d[x][y]=0表明不确定二者关系。②假如某个节点i的排名可以确定,意味着,从1~N,d[i][j]和d[j][i]至少一个为1,否则关系不能确定。#include<stdio.h>#include<iostream&g...原创 2020-02-17 14:42:04 · 318 阅读 · 0 评论 -
POJ1502模板题
传送门主要是输入输出。int x = atoi(char s[]);//可以将字符串转化为整数#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string>#include<string.h>#inclu...原创 2020-02-17 11:48:58 · 252 阅读 · 0 评论 -
负环、正环的判断 POJ 3259 POJ 1806 POJ 2240
文章目录负环的判定正环的判定负环的判定原理:在SPFA算法中,每个点会多次加队,多次出队,但是在经过最多n次后,m条边都会满足三角形不等式,此时的 dis[]即为所求。换言之,每个点最多入队出队n次。而如果存在负环,就会在此负环上无限迭代下去,最终,这个点的入队次数将超过 n次。用一个cnt[I]记录每个点入队次数,一旦cnt[i]超过n,立刻退出,说明存在负环,当然最短路也不存在。模板...原创 2020-02-17 10:28:46 · 419 阅读 · 0 评论 -
POJ3268 POJ 1511 建反图
多源单汇问题Description:求1~N到目的地X的最短路。Solution:以X为起点,1~N到终点,当然图也要反着建,也就是起点终点互换。(代码巨丑~~)#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string&...原创 2020-02-17 09:01:38 · 234 阅读 · 0 评论 -
POJ-3662: DP+SPFA求路径上的第 k 大的边权尽可能小的路径
求路径上的第 k 大的边权尽可能小的路径Description:从1到N走一条路径,可以选择k条路径将它的权值更改0,求此时的路径中最大边权尽可能小的路径。状态: d[i][k]代表到达第i的节点的时候,已经使用了k次免费机会的权值。这里的权值定义为出去免费的那些边,出现的最大边权尽可能小的值DP方程d[v][j]=min(d[u][j−1],max(d[u][j],w){{d[v][j...原创 2020-02-15 12:03:55 · 233 阅读 · 0 评论 -
最大边权尽可能小的路径+最小边权尽可能大 变形Dijkstra POJ2253 && 变形 Floyd UVA 10048 && 变形 Dijkstra POJ1797
求路径上的最大边权尽可能小的路径#include<stdio.h>#include<iostream>#include<cmath>#include<math.h>#include<string>#include<string.h>#include<algorithm>#include <qu...原创 2020-02-14 22:11:41 · 558 阅读 · 0 评论