图论
crosaa
这个作者很懒,什么都没留下…
展开
-
【图论】浅析费用流
目录模板直接应用费用流之二分图最有匹配最大权不相交路径网格图模型拆点费用流之上下界可行流模板EK#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=原创 2021-11-07 12:00:06 · 108 阅读 · 0 评论 -
【图论】网络流模板
网络流最大流,最小割费用流最大流,最小割dinic#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define ll long longusing namespace std;const int Maxn=2e2+5,Maxm=(5e3+50)*2,INF=1e8;struct edge{ int to,nxt; ll f;}e[Maxm];int原创 2021-11-07 10:25:50 · 67 阅读 · 0 评论 -
【图论】二分图
二分图结论二分图的判定最小点覆盖(二分图)最大独立集(二分图)最小路径覆盖(DAG)最小路径重复点覆盖(DAG)结论1.最大匹配数=最小点覆盖=总点数-最大独立集=总点数-最小路径覆盖2.一个图是二分图=图中不存在奇数环=染色法没有矛盾3.匹配:任意两条边都没有公共点4.匹配点:在匹配中的点5.最大匹配=不存在增广路径二分图的判定定义:看一个图中的点能不能分成满足下面条件的两部分,同一个集合内部的点之间没有直接边相连,图中的边只存在与相邻的两个集合中方法:染色法,就是dfs或bfsd原创 2021-11-07 10:16:50 · 164 阅读 · 0 评论 -
【图论】浅析最大流
@[TOC] [目录]dinic模板inline bool bfs(){ while(!q.empty()) q.pop(); q.push(S); memset(dep,0,sizeof(dep)); dep[S]=1;cur[S]=head[S]; while(!q.empty()) { int now=q.front();q.pop(); for(int i=head[now];i>1;i=e[i].nxt) { int nx=e[i].to; if原创 2021-11-07 08:25:09 · 266 阅读 · 0 评论 -
【图论】浅析最小割
最小割割的定义最小割模板dinic最小割的直接应用最大权闭合图最大密度子图最小点权覆盖集(二分图)最小割之最大独立点集(二分图)割的定义割就是一个点集,可以是图上任意几个点的任意组合,只要把图分成两个不相交的子集就可以,我们可以发现,一个图会有2^(n-1)个割最小割模板dinic最小割的直接应用就是直接用dinic算出最小割最大权闭合图// u,v,cfor(int i=1,t;i<=n;i++){ t=read(); add(i,T,t);}for(int i=1,a原创 2021-11-05 08:30:12 · 1687 阅读 · 0 评论 -
【图论】匈牙利算法(二分图最大匹配)
注意几个问题:1.#include<iostream>#include<cstdio>#include<cstring>using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1;ch=getchar(); } while(ch>='0'&&ch&l.原创 2021-11-02 10:13:06 · 222 阅读 · 0 评论 -
【图论】lca复习记录
1.lca可以求树上两点之间路线的距离,再开一个数组进行倍增处理最小值,或者最大值的限制,讲ans和这个新开的倍增数组进行比较,得ans2.lca可以和其他的结合在一起考,很恶心比如何最小生成树一起,这样,拿到题的时候就不一定能看出是不是一个树上的问题了...原创 2021-10-22 21:10:52 · 88 阅读 · 0 评论 -
【图论】判环
在有向图中判断是否有环可以采用以下算法1.tarjan求强联通分量2.并查集判环3.spfa判断负环4.dfs暴力判环下面给出并查集判环的代码可以判最小环,也可以判断最大环using namespace std;int f[200002],d[200002],n,minn,last; //f保存祖先节点,d保存到其祖先节点的路径长。 int fa(int x){ if (f[x]!=x) //查找时沿途更新祖先节点和原创 2021-10-18 10:53:14 · 288 阅读 · 0 评论 -
【图论】最短路的路径计数
floyd算法例题P1841 [JSOI2007]重要的城市在算一般的图的时候可以使用int fi[205][205];int ki[205][205];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1; i<=n; ++i) { for(int j=1; j<=n; ++j) { fi[i][j] = 0x3f3f3f3f; } fi[i][i] = 0; }原创 2021-10-10 09:32:06 · 95 阅读 · 0 评论 -
【图论】差分约束
查分约束就是跑最短路的代码,个人喜欢spfa虽然容易被卡注意点:1.预处理建边,看好条件,分析一下 i 到 i + 1 的最短情况是什么,在分析 i 到 i - 1的最短情况,需要建这两向的边,否则有可能跑不到终点。2.建边方向要对,看好题目中要求什么,是要最长路还是最短路3.最易spfa过程中,取出队首元素的时候需要吧vis改成0,否则就炸了4.跑的时候queue不用开struct 只需把点的编号记录就行代码:#include<iostream>#include原创 2021-10-02 13:12:01 · 81 阅读 · 0 评论 -
【图论】浅析lca(暴力+倍增)
暴力思想:先把两个起点移动到同一个深度上,再同时进行while循环,寻找公共祖先,找到就可以break其实这跟正版的倍增lca就差一个数组,和一个二进制优化2^n上代码:#include<bits/stdc++.h>using namespace std;const int Maxn=5e6+5;struct egde{ int to,next;}e[Maxn];int n,m,s,tot;int dep[Maxn],fa[Maxn],head[Maxn];..原创 2021-08-17 21:11:02 · 171 阅读 · 0 评论 -
【图论】 树上前缀和
用set维护一下,就像这个题,因为节点深度必须是升序的,就不会出现有一条边经过根节点的点,可以用树上前缀和问有多少条路径的节点权值总和为ss。路径中节点的深度必须是升序的。假设节点11是根节点,根的深度是00,它的儿子节点的深度为11。路径不必一定从根节点开始。每搜到一个点,就求一下前缀和,当搜到一个根节点再回溯的时候,注意一个特殊的用法set.count(const int&)#include<iostream>#include<cstdio&...原创 2021-08-14 15:35:40 · 209 阅读 · 0 评论 -
【图论】浅析图论最短路算法
个人比较喜欢,dijkstra和spfa首先,存图方式有很多,个人喜欢链式前向星线性存图flyod:这个算法的复杂度是O(n^3),在竞赛中,一般超过一亿的算法就要谨慎,所以,这个可以在n<500的时候用。1 注意判断重边。2 注意赋值f[i][i]=0。3 使用时注意条件。4if(dp[i][k]!=1e9&&dp[k][j]!=1e9)不加这一句的话会莫名其妙出错#include<iostream>#include<cstdi.原创 2021-08-07 18:52:00 · 85 阅读 · 0 评论 -
【图论】dijkstra的误区
什么是dijkstradijkstra?dijkstradijkstra的原理/流程?dijkstradijkstra本质上的思想是贪心,它只适用于不含负权边的图. 我们把点分成两类,一类是已经确定最短路径的点,称为"白点",另一类是未确定最短路径的点,称为"蓝点" dijkstradijkstra的流程如下:: 1.1.初始化dis[start] = 0,dis[start]=0,其余节点的disdis值为无穷大. 2.2.找一个disdis值最小的蓝点x,x,把节点xx变成白点. ..转载 2021-08-07 18:28:39 · 85 阅读 · 0 评论 -
【图论】 lca
用倍增方式写lca需要看的lca讲解#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int Maxn=5e5+2;struct node{ int to,next;}e[Maxn*2];int n,m,st;int cnt;int head[Maxn],d[Maxn],p[Maxn][.原创 2021-08-03 21:31:42 · 61 阅读 · 0 评论