随笔分类 - 图论
图论模板和刷题
摘要:最短路 单源最短路 Dijkstra算法 边权非负 # include <bits/stdc++.h>using namespace std;typedef long long LL;struct Dijkstra{ #define MAXN 1234 #define INF 0x3f3f3f3f
阅读全文
摘要:最小生成树 一、Krustral 克鲁斯卡尔算法 /* https://vjudge.net/problem/HDU-1863 复杂度 E*log(E) 适用于稀疏图*/# include <bits/stdc++.h>using namespace std;const int MAXN=100+
阅读全文
摘要:二分图带权最大匹配(二分图最优匹配) KM算法在稠密图上效率高于费用流。局限性:只能在满足“带权最大匹配一定是完备匹配”的途中正确求解。 若相等子图中存在完备匹配,则这个完备匹配就是二分图的带权最大匹配。 KM算法 O(n^4) 1-N 和 0 -N 全局一致; u和v一致; # include <
阅读全文
摘要:拓扑排序 # include <bits/stdc++.h>using namespace std;const int LEN_of_Node=1e4+100;const int LEN_of_Edge=2e4+100;int cnt;int n,m;int num;struct Edge{ in
阅读全文
摘要:无向图的割点和桥 1.割点 # include <bits/stdc++.h>using namespace std;const int MAXN=2e4+100;vector<int> G[MAXN];int dfn[MAXN],iscut[MAXN],low[MAXN]; //iscut[i]
阅读全文
摘要:无向图的双连通分量 1.点双连通分量 v-DCC 性质:1.顶点数不超过2 2.图中任意两点都同时包含在至少一个简单环中 3.如果该分量里有一个奇圈,那么其他所有点也必然在某个奇圈中;含有一个奇圈的充要条件是该分量不是二分图。 注意:割点的bccno可以是有多种选择,不一定是想要的那一个 最小方案数
阅读全文
摘要:有向图的强连通分量 1.Tarjan O(V+E) dfn[u]表示dfs时达到顶点u的次序号(时间戳),low[u]表示以u为根节点的dfs树中次序号最小的顶点的次序号,所以当dfn[u]=low[u]时,以u为根的搜索子树上所有节点是一个强连通分量。 先将顶点u入栈,dfn[u]=low[u]=
阅读全文
摘要:网络流之最大流 流函数三大性质: 1)容量限制:f(x,y) <= c(x,y) 2)斜对称:f(x,y)=-f(y,x) 3)流量守恒:x!=S,x!=T,Σf(u,x)=Σf(x,v) c(x,y)=0说明该条边不在图中,同时f(x,y)<=0 最大流 EK算法 O(ve^2) 10^3--10
阅读全文
摘要:图论结论 1.任意一个有6个顶点的简单图或其补图一定包含一个三角形(Ramsey定理) 网络流之最大流 流函数三大性质: 1)容量限制:f(x,y) <= c(x,y) 2)斜对称:f(x,y)=-f(y,x) 3)流量守恒:x!=S,x!=T,Σf(u,x)=Σf(x,v) c(x,y)=0说明该
阅读全文
摘要:无向图的联通分量 const int MAXN=1e4+100;vector<int> G[MAXN];bool vis[MAXN];void dfs(int u){ for(int i=0;i<G[u].size();++i){ if(!vis[G[u][i]]){ vis[G[u][i]]=1;
阅读全文
摘要:二分图最大匹配 增广路的性质: 1).长度是奇数 2).路径上第1,3,5...,len条边是非匹配边,第2,4,6,...,len-1条边是匹配边。 二分图的一组匹配S是最大匹配,当且仅当图中不存在S的增广路 相关定理: 完备匹配:给定一张二分图,其左部、右部节点数相同,均为N个节点。如果该二 分
阅读全文
摘要:数据结构和图论易错点 Edge &t=egde[i] 初始化是否完全 空间是否开够了 是否需要LL
阅读全文
摘要:三种存图方式 1.邻接矩阵 2.邻接表 邻接表是一种对于每个顶点,用链表来存储以该点为起点的边的数据结构。 # include <bits/stdc++.h>using namespace std;const int MAXN=250;struct Edge{ int to,w,next;}edg
阅读全文
摘要:树上差分 # include <bits/stdc++.h>using namespace std;const int MAXN=1e5+100;struct Edge{ int to,w,next;}edge[MAXN<<1];int head[MAXN];int tot=0;void add(
阅读全文
摘要:树的直径 1.树形DP求树的直径 void dp(int x){ v[x]=1; for(int i=head[x];~i;i=edge[i].next){ Edge e=edge[i]; if(v[e.to]) continue; dp(e.to); ans=max(ans,d[x]+d[e.to
阅读全文
摘要:二分图染色判断 判断图中不存在奇数环 O(n+m) //P1155# include <bits/stdc++.h>using namespace std;const int MAXN=1e3+100;vector<int> G[MAXN];int color[MAXN];int bipart(i
阅读全文
摘要:LCA 1.向上标记 2.树上倍增 O((n+m)log n) # include <bits/stdc++.h>using namespace std;const int MAXN=5e4+100;struct Edge{ int next,to,w;}edge[MAXN<<1];int tot
阅读全文
摘要:A* 定点第k短路 # include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN=1e3+100,MAXM=1e5+100;#define INF 123456789int n,m,s,t,k;st
阅读全文