图论
图论相关算法
zipper112
这个作者很懒,什么都没留下…
展开
-
二分图最大匹配(匈牙利算法&Dinic算法)
二分图最大匹配:给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选择一次。现在问你左边的节点能完成匹配的做多能有几个?通俗一点就是,有一群人,有一堆奖品,每个人都有自己心仪的奖品,每种奖品只有一份,问你最多能有多少能拿到自己心仪的奖品(每个人只能拿一份,而且每个人可能有多重心仪的奖品)?匈牙利算法:匈牙利算法的做法就是,先让每个左边节点去匹配,如果存在没有被匹配到的右边原创 2020-07-16 15:52:10 · 1185 阅读 · 0 评论 -
最小割&费用流
最小割:对于一个网络流图,把整张图分割成两个部分,一部分包含源点,一部分包含汇点的分割方式叫做割。割的容量即切割边时所切去边的容量之和,其中使割的容量最小的割叫做最小割求法:一张网络流图的最小割等于它的最大流,至于怎么证明可以看一下这篇博客这里本人太菜就不证明了。既然知道了它们相等,那么就可以跑最大流的模板来找最小割了常见模型:小M的作物上面有一道题,里面就用到了一个最小割的模型,即二选一模型。这种模型大概就是,有一些点集可以被分到连个集合中,分到A花费为XXX,分到B花费为XXX。费用原创 2020-07-16 15:23:48 · 227 阅读 · 0 评论 -
网络流-最大流(Ford-Fulkerson算法&Dinic算法)
#include<bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int maxn = 1e5 + 5;int n,m,cnt = 2,h[maxn];int st,ed;bool vis[maxn];struct node{int w,e,nex;}e[maxn * 2];void add(int a,int b,int c){e[cnt].e = b;e[cnt].nex = h[a];e[原创 2020-07-14 10:13:34 · 683 阅读 · 0 评论 -
C. Ehab and Path-etic MEXs
一道没写出来的的题,多亏学长和另一个大佬的指点才让我恍然大悟。解法一:考虑所有节点的度,如果所有节点的度都小于三,那么这棵树就变成了链,mex的最大值一定是n−2n-2n−2如果存在节点节点的度大于三,那么就把这个节点的三条边分别标记为0,1,20,1,20,1,2, 这样mex的最大值无论如何都不会超过2。因为mex的最大值超过2的前提是存在两个点,这两个点之间的路径中存在0,1,20,...原创 2020-03-15 09:49:53 · 220 阅读 · 0 评论 -
Tarjan求连通分量&缩点
非常的失败,花了一下午就学了一个Tarjan感觉莫名的浪费了好多时间,这里来整理一下我学得到的东西。B站的一个讲的很细视频1.强连通:在一个图中对于任意两个点都可以互相到达那么就称这个图为强连通图。连通分量:一个图的极大强连通子图,称为强连通分量一个连通分量比较类似于一个集合,里面的任点都可以互相到达缩点:把一个连通分量整体看作是一个节点,那么这个节点就是缩点2.Tarjan算法:...原创 2020-03-09 21:53:06 · 156 阅读 · 0 评论 -
prim & kruskal 最小生成树(笔记)
生成树:简单来说就是除去一个图的一些边使剩下的所有节点的构成一棵树,而最小生成树就是剩下所构成树的边的和最小的一种生成树。prim算法:prim求最小生成树和dijkstra算法有些类似,prim也是通过每次寻找最短的距离来更新其他的点朴素版:O(N2)O(N^2)O(N2)堆优化版不如kruskal所以以下就不给出了。过程:初始化所有点到集合A (加入最小生成树的点) 的距离为正无穷...原创 2020-02-27 19:51:55 · 137 阅读 · 0 评论 -
floyd最短路(笔记)
思路:非常像区间动归,求第iii个点到第jjj的最短距离可以在这两个点之间插入一个点kkk即(d[i][j]d[i][j]d[i][j]表示第iii个点到第jjj个点得距离)比较dist[i][j]dist[i][j]dist[i][j]和dist[i][k]+dist[k][j]dist[i][k] + dist[k][j]dist[i][k]+dist[k][j]之间的大小,dist[i][...原创 2020-02-20 19:52:23 · 159 阅读 · 0 评论 -
bellman_ford与spfa求最短路算法(笔记)
bellman_ford:非常简单的算法,想象一下,给你n条边,你要怎么去求从点1点n的最短路呢?最简单的方法就是遍历每一条边了,每一条边都有起点与终点,每遍历一次,相当于从其起点到终点走过了一次,而每次都可以计算从从起点到终点的最短距离就这样反复遍历,就可以找出最短路了, 更新公式:dist[边的起点]=min(dist[边的终点]+权重,dist[边的起点])dist[边的起点] = min...原创 2020-02-19 19:21:02 · 166 阅读 · 0 评论 -
图的广度优先遍历 + 拓扑排序(笔记)
广度优先遍历:模板题广度优先遍历的大体思路就是:每次扩展当前一步能到达的未标记的点加入队列中并标记,每次也从队列中拿出一个点进行扩展。该题是让求最权值都相等的短路我们就可以利用广度优先搜索来求。#include<bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;cons...原创 2020-02-02 19:17:43 · 1584 阅读 · 0 评论 -
迪杰斯特拉(dijkstra)笔记
Dijkstra算法是用来解决有权图(无负权)中的最短路问题。过程:首先我们初始化一个数组distdistdist将其所有值初始化为无穷,dist[i]dist[i]dist[i]表示到iii点的最短距离。然后我们把所有的节点分到两个集合S与V中,S集合表示已确定最短路的节点的集合,V表示未确定最短路的节点的集合。1.从起点出发到起点(设为x)的距离是0所以可以确定x一定位于S中2.接下...原创 2020-02-02 18:24:51 · 203 阅读 · 0 评论 -
树的重心(笔记)
原题刚看了一点图论…做一个笔记吧;这个题思路很简单,主要是树的dfs的一个应用。题目要求求树的重心,然后删去接着求剩下连通块中的最大值。(重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。)1.每一个连通块的节点数目应该等于它的 子树的节点数目之和+1子树的节点数目之和 + 1子树的节点数目之和+1.2.如果节点x是重...原创 2020-01-31 22:52:20 · 187 阅读 · 0 评论