图论

新的安排

不羁岁月 提交于 2019-11-26 18:04:32
1.计算几何一些常见的板子题要切掉,刷完后,由每个点拓展出来的模板题,代码模板要准备好。 2.洛谷试炼场继续刷,争取把省选组的早日刷完,练习代码实现能力 3.cf做不到每日一场,隔上两天来一场,练习短时间思维能力 4.通过多校发现自己搜索部分的ida*,以及图论的二分图匹配,网络流等完全没接触过。所以计算几何板子题过完后,把算法进阶指南,搜索,图论的板子题切掉,做好总结。 来源: https://www.cnblogs.com/rainyskywx/p/11330026.html

图论笔记

和自甴很熟 提交于 2019-11-26 17:52:17
目录 最小生成树 例题 怎么证明合数都可以分成素数的乘积 在最大生成树上求两点路径中边权的最小值 kruskal重构树 最短路 SPFA判负环 建图技巧 拓扑排序 queue优化 tarjian 差分约束 环套树/基环树 基环树找环 欧拉图 圈套圈算法 图论 最小生成树 $N$个城市,$M$条可修的公路,每条公路有一个修的成本$w_i$,要使$N$个城市连通,所需要的最低成本? 最少需要$N-1$条边,构成一棵树。 ## Kruskal算法证明 对图的顶点数$n$做归纳,证明$Kruskal$算法对任意$n$阶图都适用 归纳基础 $n=1$,显然能找到最小生成树 归纳过程 例题 P1550 [USACO08OCT]打井Watering Hole 思路就是建立一个超级源点往每个点建一条边权为$w_i$的边,然后跑最小生成树 怎么证明合数都可以分成素数的乘积 就不写了,我太菜了 在最大生成树上求两点路径中边权的最小值 int f[N][20]; //i的第2^j祖先 int mn[N][20]; //i往上跳2^j祖先所经过的边的最小值 int query(int u,int v) { int ans=inf; if(dep[u]>dep[v]) swap(u,v); for(int i=0,k=dep[v]-dep[u];i<=LG[k];++i) if(k>>i&1) { ans

DP&图论 DAY 4 下午图论

空扰寡人 提交于 2019-11-26 17:22:58
DP&图论 DAY 4 下午 后天考试不考二分图,双联通 考拓扑排序 图论 图的基本模型 边: 有向边构成有向图 无向边构成无向图 权值: 1.无权 2.点权 3.边权 4.负权(dij不可以跑) 环: 1. 2.重边 3.有向无环图DAG 路径: 1.简单路径:不经过重复的点 1-->2-->3 不简单路径:经过重复点 1-->2-->3-->1-->4 2.连通,具有传递性 图: 1.树:n个点,n-1条边的无环连通图 2.完全图:一个无向图,图中任意两点之间都有一条连边 3.竞赛图:完全图中的每一条边确定一个方向 4.基环树 5.仙人掌:不是树,图里可以成环,每一条边,要么不在环上,要么只属于一个环 图的输入方式 图的存储方式 图的遍历方法 拓扑排序基于BFS 三种遍历顺序 1.前序遍历 中左右 2.中序遍历 左中右 3.后序遍历 左右中 QUS:给前序中序,写后序 前序第一个就是根,找到在中序的位置,递归 例题1: 给定一个有向图,边权为 1 或 2 ,求单源最短路。 >Solution 稍微改写一下 BFS 即可。 # 创建三个集合, Q 0 表示当前层, Q 1 表示距离为 1 的层, Q 2 表示距离为 2 的层,初始 Q 0 = { s } , Q 1= ∅ , Q 2= ∅ # 依次取出 Q 0 中的点,将其邻点放入对应的 Q 1 或 Q 2 中 # Q 0 =

DP&图论 DAY 4 上午

↘锁芯ラ 提交于 2019-11-26 17:22:35
DP&图论 DAY 4 上午 概率与期望 概率 ◦ 某个事件 A 发生的可能性的大小,称之为事件 A 的概率,记作 P(A) 。 ◦ 假设某事的所有可能结果有 n 种,每种结果都是等概率,事件 A 涵盖其中 的 m 种,那么 P(A)=m/n 。 ◦ 例如投掷一枚骰子,点数小于 3 的概率为 2/6=1/3 。 ◦ 如果两个事件 A 和 B 所涵盖的结果没有交集,那么 P(A 或 B 发生 )=P(A)+P(B) ◦ 还是掷骰子 ◦ P( 点数小于 3 或点数大于 4)=2/6+2/6=2/3 ◦ 如果 A 和 B 所涵盖的结果有交集 ◦ 那么 P(A 或 B 发生 )=P(A)+P(B)-P(A 与 B 同时发生 ) ◦ P( 点数小于 3 或点数为偶数 )=2/6+3/6-1/6=2/3 ◦ 记事件 B 为“事件 A 不发生” ◦ 那么 P(A)+P(B)=1 ,即 P(B)=1-P(A) ◦ P( 点数不小于 3)=1-2/6=2/3 ◦ 在两个互不干扰的事中,事件 A 在其中一件事中,事件 B 在另外一件事中 ◦ 那么 P(A 与 B 同时发生 )=P(A)*P(B) ◦ 掷两个骰子, P( 第一个点数小于 3 且第二个点数为偶数 )=(2/6)*(3/6)=1/6 期望 ◦ 事件 A 有多种结果,记其结果的大小为 x ,那么 x 的期望值表示事件 A 的结 果的平均大小

DP&图论 DAY 3 上午

守給你的承諾、 提交于 2019-11-26 17:22:32
DP&图论 DAY 3 上午 状态压缩 dp >状态压缩 dp ◦ 状态压缩是设计 dp 状态的一种方式。 ◦ 当普通的 dp 状态维数很多(或者说维数与输入数据有关),但每一维总 量很少是,可以将多维状态压缩为一维来记录。 ◦ 这种题目最明显的特征就是: 都存在 某一给定信息的范围非常小 (在 20 以内),而我们在 dp 中所谓压缩的就是这一信息。 ◦ (或者是在做题过程中分析出了某一信息种类数很少) ◦ 我们来看个例子。 > 经典题 ◦ 给出一个 n*m 的棋盘,要放上一些棋子,要求不能有任意两个棋子相邻。 求方案数。 ◦ n<=100; ◦ m<=8 。 >Solution dp[i][0/1][0/1]....[0/1] 第 i 行每一列的状态0/1 然后考虑第i+1行,如果不冲突,转移 然后发现多维可以压缩成一个数dp[i][s] dp[i][s]-->dp[i+1][s'] s‘和s不冲突,&一下=0 ◦ 我们发现这个 m 是非常小的,这样就可以启发我们对每一行 2^m 状态压缩。 ◦ 设 dp[i][S] 表示到了第 i 行,第 i 行的状态是 S 的方案数是多少。 ◦ 其中 S 的第 j 位为 1 ,表示 i 这行第 j 位放了一个棋子。 ◦ 状态转移: dp[i][S]=sigema {dp[i-1][ S' ] | S&S' ==0 } 。 ◦

乱七八糟的图论1

老子叫甜甜 提交于 2019-11-26 17:19:53
图的基本概念 图是点和边组成的集合体,G=<V,E>; V是点集 E是边集 有向边,有向图 无向边,无向图 无权、点权、边权、负权 环、自环、重边、有向无环图(DAG) 路径、简单路径:没有经过重复的点、连通 树:n个点n-1条边的连通图、完全图:任何两点间都有一条边(无向图)、竞赛图:将完全图上的每条边定一个方向、基环树:有一个环,其他全是树、仙人掌:可以存在环,但是每一条边,至多只存在于一个环中 图的输入方式 最常见的输入方式是用 1 - N 表示顶点,并逐行给出 M 条边所连接的两点和边权大小。 N M u1 v1 w1 u2 v2 w2 . . . um vm wm 如果有点权,一般会用一行 N 个数表示每个点的权值大小。 p1 p2 . . . pn 邻接矩阵是最简单的图存储方式。 对于 N 个点的图,用 N × N 的二维数组记录两点之间是否有边相连,以及边权大小。 空间复杂度 O(N^2) 对于边不存在的情况,可能采用 ∞,也可能使用 0 或 -1 等等特殊值,视具体情况而定。 对于有重边的情况,可能不能完整保留所有边的信息。 邻接表是更为常用的图存储方式。 对每个点 u 用不定长度数组或链表存储所有以其为起点形如< u, v > 的边。 无向图双向边拆分为两条单向边。 不定长数组 链表 空间复杂度 O(N + M) 图的遍历方法: 广度优先搜索bfs 队列

图论基础(存图,最短路)(8.9)

好久不见. 提交于 2019-11-26 17:16:12
什么是图鸭? 什么是有向图鸭? 什么是权鸭? 就是点和边的价值辣 什么还有负权??! 什么是环啊? 就是从一个点出发能走回自己辣 注意重边!!! 有向无环图:缩写:DAG 顾名思义,就是一个没有环的有向图 简单路径:没有经过重复点的路径 什么是树鸭? 包含n个点,n-1条边的连通图 树没有环。一般来说是个无向图,但是我们通常会顶根 完全图 图上有n个点,有n 2 条边 竞赛图 有方向的完全图,但边数还是n 2 ,不是2n 2 基环树:环上挂着棵树的东西 仙人掌:每一条边最多属于一个环的东西 图的存储方式: 1.邻接矩阵 如果(u,v)之间有连边,那么邻接矩阵a[u][v]的值就是边权 用处:跑弗洛伊德 更为常见的方式 如果毒瘤出题人让你做很长很长的dfs还不给你开栈,那就只能手写了 遍历方法 三种dfs序: 是树的遍历顺序 前序遍历:头 左 右(也就是最常用的遍历顺序) 中序遍历:左 头 右 后序遍历:左 右 头 给出前序,中序,写后序: 前序第一个:树根 在中序中找根,根左边是左子树,右边是右子树,把它们从原序列里拎出来,看前序序列中的根,递归搞 只用dfs,bfs怎么过? 维护三个集合,一个记录距离为d的,一个记录距离为d+1的,一个记录距离为d+2的 先枚举距离为d的集合的点,看他的出边是1还是2,然后把终点扔到对应的集合里依次更新每个集合 边长均为1

【算法简述】图论专题:最短路

这一生的挚爱 提交于 2019-11-26 17:09:24
图论问题概述总结 几种算法 Dijkstra单源最短算法 堆优化Dijkstra SPFA单源最短路算法 Floyd 多源最短路算法 差分约束系统 对于 图论 ,我们尊熟悉的算法是比较多的,这次,我就找了集中常用的算法。 几种算法 最短路 算法(Dijkstra,SPFE,FLOYD) Dijkstra单源最短算法 首先,此算法适用于计算一个点到另一个点的最短路径,且算法绝对不能出现负环。这个算法的速度慢,只用于接觉小规模的问题,如图: 这个图就是求算法的基本思路。 算法过程: 从节点上找到最近点那个节点,将他标记,加入集合U。 将定点U连出边的邻点相连接,不在集合U中寻找。 重复前面的操作,用来指导V=U是,查找结束,最后结束流程。 本算法的算法流程图: https://wenku.baidu.com/view/8a5c11303968011ca300916a.html 参考代码: #include <iostream> #include <cstring> using namespace std; const int N = 1e3 + 9; const int M = 1e4 + 9; const int inf = 0x3f3f3f3f; struct edge { int v, w, next; edge() {} edge(int _v, int _w, int

图论小专题B

谁都会走 提交于 2019-11-26 14:57:41
2 树 2.1 树的定义 一个只有 \(N-1\) 条边,且任意两个点连通的图叫做树。通过这样定义的树往往是一棵无根树,而我们通常会任意选定一个根节点使其变成有根树。有根树可以定义“父亲和儿子”的层次关系,这往往有利于构造最优子结构,进行DP和搜索等操作。 特别的,如果在树上任意加上一条边,那么整个树上就会多出一个环。我们称这样的树是“基环树”。基环树不是树,但是它只有一个环。将整个环作为一个“广义根”,然后将根和连在环上的子树分开处理,同样可以套用树的许多算法。 2.2 树上的DP算法 通常选定一个根,然后用DFS计算。至于递归接口应该放在转移之前还是之后呢?那就看方程怎么写了。在写程序的时候,只要满足“已知推未知”的原则就行。 如果给定一棵无根树,答案要求给出最优的根使得某个值最优化,这时可以采用“换根法”。先任意选定一个根计算出规划值 \(F_1\) ,然后从数学上推导出以任意点为根的规划值 \(F_2\) 。《进阶指南》上有相关的例题。 2.2.1 树的参量 子树大小size 最基础的量。转移方程简记为 \(F(x)=1+\sum F(\text{son}(x))\) 树的重心 和size一样。如果子树 \(x\) 的大小是 \(\text{size}(x)\) ,那么剩下树的大小就是 \(N-\text{size}(x)\) 。在求 \(\text{size}\)