
图论
ShɑΙteж
think twice,code once
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CSP 202009-3 点亮数字人生
有向图 拓扑排序 顺便判断有没有环 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int N=1e4+10; int T,n,m,k,q1,val[N],du[N],tmpdu[N],x; vector<int> to[N],q[N],原创 2021-03-17 10:37:46 · 265 阅读 · 0 评论 -
【POJ2135】无向图最小费用最大流
【POJ2135】 题目大意 给出一个无向图,每条边有边权,求从 1->n->1 的最短路径 分析 从1走到n和从n走到一是等价的(因为是无向图) 问题就转化为求两条从1走到n的不相交路径,并且最小化路径长度 可以构造出一个网络,每条边容量是1费用是边权,起始边容量为2费用为0,跑一边最小费用流即可 Code #include<bits/stdc++.h>...原创 2019-01-09 16:17:26 · 1647 阅读 · 0 评论 -
和平委员会 2-SAT
Problem 如果a1和b1不能同时出现 就连一条边a1->b0&b1->a0 暴力寻找合法解即可 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; const int N=2e5; struct node{i...原创 2019-02-22 21:41:28 · 358 阅读 · 0 评论 -
[FZOJ190] 网络流+二分答案
[FZOJ190] 难点在建图 建分层图,拆点,从一层走到另一层代表当前走的路径长度增加了1 二分答案,代表最短路最大是多少 从起点开始求一个最小割 把属于最小割的边ban掉,就相当于选中了这个点,及花费增加1,只有这样才能使最短路增加1 画个图感性理解一下 思路太神仙了,这题就当板子用吧 #include<bits/stdc++.h> #define rep(i,...原创 2019-02-28 19:22:44 · 429 阅读 · 1 评论 -
[SDOI2009]晨跑 费用流
[SDOI2009] BZOJ题面谁写的,出来挨打 费用流垃圾套路题,拆点即可 #include<bits/stdc++.h> #define rep(i,a,b) for(ll i=(a);i<=(b);i++) #define per(i,a,b) for(ll i=(a);i>=(b);i--) #define st(x) x #define ed(x) x...原创 2019-03-05 15:22:32 · 227 阅读 · 0 评论 -
[ZROI138]赛尔号 欧拉回路
欧拉回路中的点入度都等于出度,所以我们可以在图中构造一条欧拉回路 考虑到图中度数为奇数的点有偶数个,所以我们把两两度数为奇数的点连一条边,这样所有点的度数都是偶数了 答案就是度数为偶数的点的个数,跑一遍欧拉回路即可 因为奇数点之间的连边不影响偶数点,而欧拉回路保证所有点入度等于出度,所以原图中的偶数点都符合条件 注意图可能不连通 Code #include<bits/st...原创 2019-03-06 11:26:22 · 622 阅读 · 0 评论 -
[JSOI2016]反质数序列 二分图匹配
[JSOI2016] 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就连一条x->y的边 最后答案显然是最大独立集=n-最小点覆盖=n-最大匹配数 最大匹配数=最大流,Dinic即可 由于1比较特殊,考虑到最终答案1的出现次数...原创 2019-03-14 19:49:50 · 297 阅读 · 0 评论 -
[TOEFL] tarjan+拓扑排序+bitset优化
n<=30000,m<=60000 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int N=3e4+100;...原创 2019-03-11 19:58:14 · 335 阅读 · 0 评论 -
[NOI2006]最大获利 最大权闭合子图
[NOI2006] 选一条边就必须选择连着的两个点 最大权闭合子图模型 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int inf...原创 2019-03-16 15:36:39 · 240 阅读 · 0 评论 -
[JSOI2016]飞机调度 DAG最少路径覆盖
[JSOI2016] 题目 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define MIN(a,b) (a>b? b:a) using namespace std; const int inf=1e9; const int N=510; struct node{int x,...原创 2019-03-20 21:19:18 · 300 阅读 · 0 评论 -
[BZOJ1797]最小割 网络流
[BZOJ1797] 对于任意一条满流边(x,y),(x,y)能够出现在某个最小割集中,当且仅当c[x]!=c[y]; 对于任意一条满流边(x,y),(x,y)必定出现在最小割集中,当且仅当c[x]==c[s]且c[y]==c[t]。 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #...原创 2019-03-17 17:21:06 · 221 阅读 · 0 评论 -
[Luogu2774]方格取数问题 二分图+最小割
[Luogu2774] 如果选一个点,那么和它四联通的点都不能选,所以我们考虑对网格进行黑白染色 我们可以先强制选择所有的点,然后再减去不合法的权值最小的点集 S->黑点连一条流量为点权的边,白点->T连一条流量为点权的边,黑点->白点连一条流量为inf的边 答案就是总和-最小割,因为如果图中存在增广路就相当于选了黑点又选了和他相邻的白点,所以要减去使图中不存在增广路...原创 2019-03-25 16:14:14 · 283 阅读 · 0 评论 -
最大密度子图
#include<bits/stdc++.h> #define rep(i,a,b) for(register int i=(a);i<=(b);++i) using namespace std; const double inf=1e9; const int N=2e3+10; struct node{int y,n;double v;}e[N*10]; int lin[N*...原创 2019-03-26 11:52:14 · 433 阅读 · 0 评论 -
[CQOI2016]不同的最小割 分治最小割
[CQOI2016] 求一个无向图中所有点对之间的本质不同的最小割的个数 一张图最多有n-1种本质不同的最小割,考虑如何快速地找到所有不同的最小割 只要让每次划分的S,T集合存在区别,就对应了不同的最小割 我们考虑分治来解决这问题,首先对于我们当前分治的点集,我们任选 两个点 s,t,然后我们计算这两个点之间的最小割,这个时候整张图会 被我们划分为 S,T 两个点集 这个时候当前对于当前...原创 2019-03-23 15:11:15 · 440 阅读 · 0 评论 -
[HAOI2017]新型城市化 二分图+网络流+关键割边
[HAOI2017] 就是求二分图的关键边 一条边是二分图的关键边当且仅当:这条边满流&&边的两端不在一个scc中 一条边是二分图的可行边当且仅当:这条边满流||边的两端在一个scc中 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a...原创 2019-03-23 17:55:23 · 349 阅读 · 0 评论 -
网络流-区间K覆盖
模板题目 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; const int inf=1e10; const int N=2e3; struct fuck{int id,op,v,l,r;}tmp[N],later[N]; str...原创 2019-01-07 17:10:53 · 410 阅读 · 0 评论 -
最大权闭合子图模板题
题目链接 Code #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define ll long long using namespace std; con...原创 2019-01-07 15:26:37 · 390 阅读 · 0 评论 -
网络流经典模型
DAG最小路径点覆盖二分图匹配 1.路径不能相交 把原图G拆点,建出一张二分图,对于每一条有向边<x,y>在二分图左部点x和右部点y之间连边,得到G‘ G的最小路径点覆盖包含的路径条数就是(n-G’的最大匹配数) 对于每条路径的终点t,t没有出边,所以在二分图中t匹配失败,即路径的终点和二分图左部非匹配点是一一对应的 所以让路径最少,就让非匹配点最少,那么就让匹配点最多,故...原创 2019-01-07 11:37:40 · 2638 阅读 · 0 评论 -
有源汇有上下界费用流
【80人环游世界】 通过建图使其满足题目约束条件 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int inf=1e9; ...原创 2019-01-05 09:33:07 · 446 阅读 · 0 评论 -
有源汇有上下界最小流
Loj117模板 和最大流类似,最大流找到可行流后增流,最小流找到可行流后退流 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) #define ll long long using...原创 2019-01-04 20:58:51 · 508 阅读 · 0 评论 -
有源汇有上下界最大流
Loj116模板 注意流量守恒再有源汇图中和无源汇图中的区别 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int inf...原创 2019-01-04 19:22:53 · 339 阅读 · 0 评论 -
无源无汇有上下界可行流
Loj115模板 注意建图 Code #include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int inf=1e10; const int N...原创 2019-01-04 16:27:17 · 278 阅读 · 0 评论 -
Dinic Algorithm
Code bool bfs(int S){//构建分层图 queue<int> q; memset(d,0,sizeof(d)); d[S]=1,q.push(S); while(q.size()){ int x=q.front();q.pop(); for(int i=lin[x];i;i=e[i].n){ int y=e[i].y; if(d[y]...原创 2019-01-03 20:44:25 · 466 阅读 · 0 评论 -
Edmonds-Krap Algorithm
最小费用最大流 Code bool SPFA(int S,int T){ memset(v,0,sizeof(v)); memset(d,0x3f,sizeof(d)); queue<int> q; q.push(S),d[S]=0,incf[S]=inf,v[S]=1; while(q.size()){ int x=q.front();q.pop();v[x]=0;...原创 2019-01-03 20:07:04 · 278 阅读 · 0 评论 -
KM Algorithm
交错树 如果从某个左部节点出发寻找增广路失败,那么在dfs的时候,所有经过的节点和边,共同构成一棵交错树 顶标 给左部节点一个整数值Ai,右部节点一个整数值Bj,满足Ai+Bj>=w(i,j) 初始时Ai=max{ w(i,j) } , Bj=0 相等子图 二分图中所有节点和满足Ai+Bj=w(i,j)的边构成子图 定理 若相等子图中存在完备匹配,该匹配即为二...原创 2019-01-03 19:53:38 · 376 阅读 · 0 评论 -
图论杂题
1.https://www.luogu.org/problemnew/show/CF827A /*首先考虑暴力,那就是每次for,显然时间无法承受 如果我们知道开头最远能到哪,就可以节省时间了,那我们 将以i开头向右最远能到的点记作fa[i]也就是关键点*/ #include<bits/stdc++.h> using namespace std; const int N=4e6+1...原创 2018-10-29 07:44:09 · 224 阅读 · 0 评论 -
SPFA判负环
模板题 Code bool SPFA(int s) { v[s]=1,q.push(s),d[s]=0; while(q.size()) { int x=q.front();v[x]=0,q.pop(); for(int i=lin[x];i;i=e[i].n) { int u=e[i].y; ...原创 2018-04-10 21:25:54 · 363 阅读 · 0 评论 -
最小生成树
Prim Algorithm priority_queue< pair<int,int> >q; void prim(){ d[1]=0;q.push(make_pair(0,1)); while(q.size()&&cnt<n){ int dis=-q.top().first,u=q.top().second;q.pop(); if(...原创 2018-02-25 13:28:53 · 221 阅读 · 0 评论 -
最短路
void dijkstra(int s){ memset(d,0x3f,sizeof(d)); memset(v,0,sizeof(v));d[s]=0; q.push(make_pair(0,s)); while(q.size()){ int x=q.top().second; q.pop(); if(v[x]) continue...原创 2018-02-24 12:42:06 · 288 阅读 · 0 评论 -
基础并查集
并查集 (1)初始化: for(int i=1;i<=n;i++) father[i]=i; 因为每个元素属于单独的一个集合,所以每个元素以自己为根节点。 (2)寻找根节点编号并压缩路径: int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return fa...原创 2018-02-24 10:20:53 · 470 阅读 · 0 评论 -
邻接表原理及实现
#include<bits/stdc++.h> using namespace std; int lin[100000000]={0};//由i出去的边的下标。 struct edge { int y;//该边的终点编号 。 int v;//该边的权值。 int next;//同起点下条边的编号。 }e[100000000]={0};//边表。 int l...原创 2018-02-23 16:46:21 · 415 阅读 · 0 评论 -
传递闭包
传递闭包是什么东西呢?就是形如一个集合,如果元素<x,y>、<y,z>在集合里,那么元素<x,z>也在集合里。放到图里就是说如果点x到y可到达,那么x和y就有一条边相连。放到矩阵里就是<x,y>是1。那么这个集合本身就是一个传递闭包。如果这个集合不满足这个性质呢?那么我们就要求他的传递闭包,让他变成一个“完整”的图。 rep(i,1,n) rep...原创 2019-01-07 07:46:22 · 4801 阅读 · 0 评论 -
图论网络流
DFS dfs树 无向图:只有树边和非树边 每条非树边对应一个环:判仙人掌 对于一个联通块忽略所有非树边进行一些操作:证明,构造 有向图:树边、回向边、前向边、同层之间的边 只有树边和前向边会从dfs序小的指向大的:Dominator Tree dfs序 无向图:dfs树上的每个子树对应dfs序的一个区间 主要是在树上使用 点/边...原创 2019-01-01 21:26:28 · 1495 阅读 · 1 评论