图论
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 · 223 阅读 · 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 · 1568 阅读 · 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 · 326 阅读 · 0 评论 -
[FZOJ190] 网络流+二分答案
[FZOJ190]难点在建图 建分层图,拆点,从一层走到另一层代表当前走的路径长度增加了1 二分答案,代表最短路最大是多少 从起点开始求一个最小割 把属于最小割的边ban掉,就相当于选中了这个点,及花费增加1,只有这样才能使最短路增加1 画个图感性理解一下 思路太神仙了,这题就当板子用吧#include<bits/stdc++.h>#define rep(i,...原创 2019-02-28 19:22:44 · 375 阅读 · 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 · 197 阅读 · 0 评论 -
[ZROI138]赛尔号 欧拉回路
欧拉回路中的点入度都等于出度,所以我们可以在图中构造一条欧拉回路 考虑到图中度数为奇数的点有偶数个,所以我们把两两度数为奇数的点连一条边,这样所有点的度数都是偶数了 答案就是度数为偶数的点的个数,跑一遍欧拉回路即可 因为奇数点之间的连边不影响偶数点,而欧拉回路保证所有点入度等于出度,所以原图中的偶数点都符合条件 注意图可能不连通Code#include<bits/st...原创 2019-03-06 11:26:22 · 568 阅读 · 0 评论 -
[JSOI2016]反质数序列 二分图匹配
[JSOI2016]奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就连一条x->y的边 最后答案显然是最大独立集=n-最小点覆盖=n-最大匹配数 最大匹配数=最大流,Dinic即可 由于1比较特殊,考虑到最终答案1的出现次数...原创 2019-03-14 19:49:50 · 269 阅读 · 0 评论 -
[TOEFL] tarjan+拓扑排序+bitset优化
n<=30000,m<=60000Code#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 · 299 阅读 · 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 · 212 阅读 · 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 · 266 阅读 · 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 · 190 阅读 · 0 评论 -
[Luogu2774]方格取数问题 二分图+最小割
[Luogu2774]如果选一个点,那么和它四联通的点都不能选,所以我们考虑对网格进行黑白染色 我们可以先强制选择所有的点,然后再减去不合法的权值最小的点集 S->黑点连一条流量为点权的边,白点->T连一条流量为点权的边,黑点->白点连一条流量为inf的边 答案就是总和-最小割,因为如果图中存在增广路就相当于选了黑点又选了和他相邻的白点,所以要减去使图中不存在增广路...原创 2019-03-25 16:14:14 · 245 阅读 · 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 · 401 阅读 · 0 评论 -
[CQOI2016]不同的最小割 分治最小割
[CQOI2016]求一个无向图中所有点对之间的本质不同的最小割的个数 一张图最多有n-1种本质不同的最小割,考虑如何快速地找到所有不同的最小割 只要让每次划分的S,T集合存在区别,就对应了不同的最小割 我们考虑分治来解决这问题,首先对于我们当前分治的点集,我们任选 两个点 s,t,然后我们计算这两个点之间的最小割,这个时候整张图会 被我们划分为 S,T 两个点集 这个时候当前对于当前...原创 2019-03-23 15:11:15 · 407 阅读 · 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 · 316 阅读 · 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 · 376 阅读 · 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 longusing namespace std;con...原创 2019-01-07 15:26:37 · 367 阅读 · 0 评论 -
网络流经典模型
DAG最小路径点覆盖二分图匹配 1.路径不能相交把原图G拆点,建出一张二分图,对于每一条有向边<x,y>在二分图左部点x和右部点y之间连边,得到G‘ G的最小路径点覆盖包含的路径条数就是(n-G’的最大匹配数) 对于每条路径的终点t,t没有出边,所以在二分图中t匹配失败,即路径的终点和二分图左部非匹配点是一一对应的 所以让路径最少,就让非匹配点最少,那么就让匹配点最多,故...原创 2019-01-07 11:37:40 · 2584 阅读 · 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 · 407 阅读 · 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 longusing...原创 2019-01-04 20:58:51 · 477 阅读 · 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 · 312 阅读 · 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 · 258 阅读 · 0 评论 -
Dinic Algorithm
Codebool 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 · 423 阅读 · 0 评论 -
Edmonds-Krap Algorithm
最小费用最大流Codebool 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 · 248 阅读 · 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 · 322 阅读 · 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 · 196 阅读 · 0 评论 -
SPFA判负环
模板题Codebool 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 · 330 阅读 · 0 评论 -
最小生成树
Prim Algorithmpriority_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 · 199 阅读 · 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 · 269 阅读 · 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 · 444 阅读 · 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 · 387 阅读 · 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 · 4720 阅读 · 0 评论 -
图论网络流
DFSdfs树 无向图:只有树边和非树边 每条非树边对应一个环:判仙人掌 对于一个联通块忽略所有非树边进行一些操作:证明,构造 有向图:树边、回向边、前向边、同层之间的边 只有树边和前向边会从dfs序小的指向大的:Dominator Tree dfs序 无向图:dfs树上的每个子树对应dfs序的一个区间 主要是在树上使用 点/边...原创 2019-01-01 21:26:28 · 1421 阅读 · 1 评论