图论
文章平均质量分 55
小胡同的诗
千里之行,始于足下
展开
-
图论入门 dijkstra(邻接矩阵)
代码如下:#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<string>#include<algorithm>#include<queue&am原创 2018-03-01 21:52:13 · 404 阅读 · 0 评论 -
HDU2860(dijkstra+堆优化)
解题报告:同朴素的O(n2)O(n^2)O(n2)写法一样,也能够记录路径,要在松弛的阶段用一个数组保存前缀节点。关于堆优化写法的注意事项:更新的时候注意那个三角不等式的意思是:我当前的最短路为dist[u],它加上新节点的w能够比源点到它的原本距离,这个w不要写成u弹出的那个节点的w!Code:#include <bits/stdc++.h>using namespac...原创 2019-05-07 23:10:18 · 180 阅读 · 0 评论 -
LeetCode236二叉树的最近公共祖先(单次询问)
题目链接:LeetCode236思路:由于是单次的查询,且是二叉链表的存储方式,所以这里采用O(n)O(n)O(n)的遍历方式维护单词询问,核心逻辑是基于后序遍历的dfsdfsdfs。逻辑如下:当root是p、q其中之一时显然root就是LCA(T, p, q);当root非q且非p时要往左右两边搜索,如果恰好一边一个,那么root是LCA(T, p, q);否则返回搜到非空结点的那一...原创 2019-08-19 14:47:36 · 148 阅读 · 0 评论 -
树上最近公共祖先(Tarjan+并查集)
算法描述tarjan算法在求强联通分量效率十分高,核心思想是维护的dfn和low数组;而对于树上公共祖先问题也能离线地处理询问,算法复杂度O(n+q)O(n+q)O(n+q)。算法是:后序遍历树上的结点,每次的子孙结点的祖先集合合并到其父亲结点中(并查集),之后去查询当前结点是否有询问,有询问且两个点都已经访问过那么这个两个点的LCA是另外那个点的祖先。由于是后序遍历的缘故,当前结点和另外那个结...原创 2019-08-19 15:37:01 · 611 阅读 · 0 评论 -
树上最近公共祖先(树上倍增)
算法描述倍增算法在ST表中的应用是直接在第二维的dp中直接以二进制的形式展现;而对于树上的问题则可以这样设计:设fa[i][j]表示i结点的第2^j个祖先,显然的是fa[i][0]等于i的父节点,假设父节点的祖先结点都已经更新完毕,我们就可以根据父亲的祖先来更新本结点的祖先,于是状态转移方程就成了fa[i][j]=fa[fa[i][j-1]][j-1],这是根据二进制中可以拆分成两个相同小一次的...原创 2019-08-19 15:55:25 · 211 阅读 · 0 评论 -
无向图的割点(tarjan)
割点:删除有向图某个点及其对应的邻边会使得联通分量数量增多,这个点称为割点。在求割点使用到了Tarjan算法。同求有向图的强连通分量类似,都是使用到了dfn以及low数组用来标记搜索树的状态。但有所区别的是,在深搜的时候要区别根的情况以及非根结点,如果是根只要有两个或两个以上的子树分支这个肯定是割点;而对于非根结点如果dfn[u]>=low[v]dfn[u] >= ...原创 2019-08-15 10:26:28 · 340 阅读 · 0 评论 -
树上最近公共祖先(欧拉序+RMQ)
算法描述根据上一个博客介绍的dfs序以及欧拉序能够把树上的点转为线性的区间点,从而可以用区间的数据结构去维护。根据欧拉序的定义,我们会发现树上任意两点的第一次出现位置之间必然夹带着lca的点,至于为什么可以画图理解一下,因为我们生成这个欧拉序时每次回溯就加一个点,而任意两点之间的搜索树一定是从lca开始往下搜,然后回溯再转而去搜另外一个点,所以lca就生成再两点的时间戳之间了。于是我们维护完欧...原创 2019-08-21 09:05:59 · 423 阅读 · 0 评论 -
dfs求拓扑排序+判环
前言什么是拓扑排序?一个感性的认识是某个开关触发必要的先行条件。例如:一个串联电路形成回路的先行条件是:1,导线联通;2,每个串联分支上联通。假如划分为多个串联分支上也有一个串联路径(实际上就是一条线上串着许多电元件),则整个串联分支联通就递归到多个子分支。根据上面的描述不难发现这是一个递归的过程,我们应用到图论基于DFS求拓扑排序的思想也类似。综上描述,拓扑排序就是一个图上的遍历序列,序列满...原创 2019-08-26 23:02:03 · 1440 阅读 · 0 评论 -
LeetCode279完全平方数(动态规划+类似SPFA的队列优化)
题目链接:LeetCode279Ps:拉格朗日四平方和定理思路:根据分析,每个大的平方数会由许多小的平方数转移过来,于是可以写出这样一个转移方程:dp[i+j2]=min(dp[i]+1,dp[i+j2])dp[i+j^2]=min(dp[i]+1,dp[i+j^2])dp[i+j2]=min(dp[i]+1,dp[i+j2]),于是我们可以枚举n以内的所有状态转移到n以内的更大的平方数,最...原创 2019-09-02 11:27:53 · 145 阅读 · 0 评论 -
二分图判定
定义对于二分图,就个人理解,是一种可以将顶点划分成两个集合的无向图,和顶点连接的边每一条都连接着这两个集合,也就是说判定一个二分图就看这张图的任意边连接的两个顶点能不能归属于两个集合。有一个等价定义是:不含有「含奇数条边的环」的图。以下举一个非二分图的例子:(显然这张图含有奇数条边的环)无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。概念什么是匹配?...原创 2019-09-02 23:17:20 · 350 阅读 · 0 评论 -
有向图最大流EK算法(水流木桶原理)
前言网络中的交换机能够实时的进行数据的接收转发,如果我们要从A地传送一组数据报到达B地,在不存在丢包的前提下一次分发B地最多能接收多少报文呢?这种网络模型可以利用水流的模拟来解决,学名称网络流。算法介绍总所周知,水往低处流。每个节点可以抽象成一个木桶,所以一次能通过的流量是有瓶颈的,根据木桶原理,我们每次可以流过的流量取决于前面最小的弧。这里很容易走进一个误区,贪心地每次去找下一条路径的最...原创 2019-09-03 09:51:57 · 1091 阅读 · 0 评论 -
HDU1874(最短路+dijkstra+堆优化)
解题报告:同O(n2)O(n^2)O(n2)算法类似,不过用邻接表存图在松弛的时候优化了遍历不相邻点的复杂度,在查询当前最短径的时候直接用小根堆弹出,复杂度从O(n)O(n)O(n)降到O(logE)O(logE)O(logE)。Code:#include <stdio.h>#include <iostream>#include <queue>#inc...原创 2019-05-07 22:51:11 · 208 阅读 · 0 评论 -
HDU2680(最短路+反向建图+spfa)
解题报告:关于spfa的实现关键点:用vector实现邻接表存图vis数组表示某个点是否在队列中(因为一个点可能多次入队)cnt表示某个点入队的次数(如果存在负环的时候可以直接判断)dist数组同dijkstra一样表示该点与源点当前的距离,inf表示不通spfa可以证明每个点平均入度的次数不超过两次,但判断负环的条件一定是cnt[v] > n,而不能单纯判断是否大于2,平均情况...原创 2019-05-07 22:46:17 · 219 阅读 · 0 评论 -
HDU1874(最短路+spfa模板题)
解题报告:虽然没有负环,不过用spfa效率也不错。Code:#include <stdio.h>#include <iostream>#include <queue>#include <algorithm>#include <string.h>using namespace std;const int maxn = (in...原创 2019-05-07 22:38:00 · 162 阅读 · 0 评论 -
HDU2544(dijkstra最短路)
解题思路:从1到n,图论最短路算法模板AC代码如下:#include<stdio.h>#include<string.h>#include<iostream>using namespace std;const int maxn=110;const int inf=0x3f3f3f3f;int image[maxn][maxn],n,m,dis[m...原创 2018-03-17 23:53:38 · 203 阅读 · 0 评论 -
HDU2680Choose the best route(dijkstra+ 反向建图)
题目大意:从w个起点到达终点s的最短路解题思路:用dijkstra,不过迪杰科斯特拉处理的是单源最短路,由于终点只有一个,起点有多个,我们考虑从终点到起点。但由于给的边是有向的,所以要反向建图,而且有重边,要取最小的那条。AC代码如下:#include<stdio.h>#include<string.h>#include<iostream>#include...原创 2018-03-18 15:47:44 · 155 阅读 · 0 评论 -
HDU2066一个人的旅行(dijkstra最短路问题)
解题思路:说解题思路还谈不上,这是我的第一题图论算法AC,借鉴了这位大佬的解题思路:点击打开链接,勉勉强强写出来了,这种题难点可能是建图的时候吧,核心算法那边边算边松弛利用了贪心的思想,在输入邻接矩阵边的时候利用一个xymax来得到一张图的最大规模,从而在dijkstra中减少运算时间。本题由于一开始有好几个相邻城市,相当于第一次松弛到起点距离把这些点的情况(即:image[0][i]更新到dis...原创 2018-03-05 20:33:23 · 213 阅读 · 0 评论 -
51Nod 1459 迷宫游戏(Dijkstra+额外松弛第二个权值(分数))
题目大意 :第一行输入四个数字N(N个顶点)、M(M条弧的信息)、start、end(起点、终点)。第二行输入N个数字,分别代表每个顶点所具有的分数。接下来M行输入弧的信息(顶点1、顶点2、之间的权值w)。问从起点到终点的最小权路径的权值之和以及其对应的最大的分数为多少?解题思路 :最短路问题,考虑用Dijkstra,然而题中需要考虑最大分数的这一个条件,我们可以这样想,每次松弛更新时记录前驱...原创 2018-06-10 16:36:49 · 265 阅读 · 0 评论 -
PAT -- 甲级1003(1003 Emergency)
1003 Emergency (25 分)As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams ...原创 2019-04-10 15:48:36 · 109 阅读 · 0 评论 -
数据结构 最小生成树(prime算法)
实验十四、最小生成树1 实验目的本实验实现最小生成树的prime算法。2 实验内容建立如图所示的邻接矩阵;2)根据prime算法求其最小生成树,如从顶点A出发生成的最小生成树为:利用前缀点数组完成记录最小生成树建立的过程Code:#include<stdio.h>#include<stdlib.h>#define MAX_SIZE 20...原创 2019-04-10 16:08:23 · 2348 阅读 · 0 评论 -
PAT --甲级1013(1013 Battle Over Cities)
1013 Battle Over Cities (25 分)It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We ...原创 2019-04-24 18:04:54 · 174 阅读 · 0 评论 -
FZU2271 X(弗洛伊德+思维)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2271思路:除去两题水题以及那两题想偏了的数学期望题就这题能做…(越学越菜了。很容易想到floyd的做法,但当两点之间有路并且除他之外有一条最短路,本条路一定能除去这个思维点不好想。Code:#include<stdio.h>#include<string.h>#include...原创 2019-04-25 11:43:12 · 170 阅读 · 0 评论 -
HDU1269(强连通分量+Tarjan)
题目链接题目大意:求给出的有向图是否为一个强联通图解题思路:Tarjan的入门题,对于Tarjan的理解关键是low数组与dfn数组的理解,前一个是当前搜索树的第一次扫描的tot值,也就是最早的时间戳,我们整个算法就是为了更新它!而dfn是每个点被搜的时间节点,显然,每个点的dfn都不同并且dfn[i] >= low[i]。由于Tarjan是基于深度优先搜索的算法,所以被搜的点的先后次序...原创 2019-05-08 15:52:32 · 424 阅读 · 2 评论 -
洛谷P2341(Tarjan+缩点)
解题报告:对于Tarjan的之前的理解的更正:关于low数组在同一个联通分量中并不是所有的点都是标记为该搜索树的dfn!所以用book数组充当染色的角色。关于该题的大意就是如果存在两个或以上的明星牛(不在同一个联通分支中)就等于没有!并且如果某几头牛相互关注,相当于形成一个强连通分量,然后该联通分量的出度为0,并且只有一个这样的联通分量的话,这个联通分量的所有牛都是明星!Code:#i...原创 2019-05-08 18:09:33 · 479 阅读 · 0 评论 -
有向图最大流FF算法(基于dfs寻找增广路)
前言FF算法在某些特例下比较慢,相比于EK算法比较容易实现,不用再去记录前驱路径已经每个点的递归下去的最大流。因为前驱节点回溯回来就可以更新,而后驱子系统的最大流可以通过dfs的值传回来,于是只有记录每个点有没有被搜过就行了。实现#include <bits/stdc++.h>using namespace std;/** * 最大流增广路FF算法*/namesp...原创 2019-09-03 10:39:34 · 1126 阅读 · 0 评论