ACM笔记-3图流
cj1064789374
大佬们多多指教
展开
-
IDA*
#include<bits/stdc++.h>#define Ll long longusing namespace std;int fx[9]{0,1,1,1,2,3,3,3,2};int fy[9]{0,1,2,3,3,3,2,1,1};int xx[4]{1,-1,0,0};int yy[4]{0,0,-1,1};int a[4][4];int n,m,x,y,...原创 2019-01-09 01:28:49 · 256 阅读 · 0 评论 -
Dinic网络最大流/最小割
#include<bits/stdc++.h>using namespace std;struct edge{int to,cap,rev;};vector<edge>g[100];int level[100];//顶点到源点的距离标号int iter[100];//在当前弧之前的边已经没有用了void add_edge(int from,int to,int...原创 2018-12-31 00:33:48 · 136 阅读 · 0 评论 -
Ford-Fulkerson网络最大流/最小割
#include<bits/stdc++.h>using namespace std;struct edge{int to,cap,rev;};//存边:终点/容量/反向边vector<edge>g[100];//图的邻接表表示bool used[100];//DFS访问标记void add_edge(int from,int to,int cap){ ...原创 2019-01-08 00:03:35 · 339 阅读 · 0 评论 -
匈牙利算法二分图最大匹配
#include<bits/stdc++.h>using namespace std;const int N=300+10;int p,n,g[N][N],linked[N],v[N];int dfs(int u){ for(int i=1; i<=n; i++)//逐个学生扫 if(!v[i]&&g[u][i]){//未访问且有...原创 2019-01-08 00:03:38 · 128 阅读 · 0 评论 -
双向广搜
#include <bits/stdc++.h>#define maxM 310#define maxN 1000000using namespace std;int n,sx,sy,ex,ey;int dir[16]={1,2,-1,2,1,-2,-1,-2,2,1,2,-1,-2,1,-2,-1};int xx[maxN],yy[maxN];int vi...原创 2019-01-08 00:03:41 · 356 阅读 · 0 评论 -
网络流isap+判断唯一性
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=1010;struct edge{ int to,cap,rev; edge(int a,int b,int c){to=a;cap=b;rev=c;...原创 2019-01-08 00:03:45 · 188 阅读 · 0 评论 -
桥和割点
#include<bis/stdc++.h>using namespace std; const int maxn=10000+10; typedef pair<int,int> Edge; int index=0,rootson=0; vector<bool> vis(maxn); vector<int> df...原创 2019-01-08 00:03:48 · 198 阅读 · 0 评论 -
强连通原理
强连通原理用途:缩点&最小点基问题原图经强连通缩点后变成了一个有向无环图。有向无环图变成强连通图只需增加max(g,h)条有向边即可(G为出度为0的节点数,H为入度为0的节点数,特别地当缩点后的图只有一个点时,答案为0数组定义:dfn[v]为遍历到点v的时间low[v]开始遍历点v时初始化为dfn[v],遍历完点v时则保存所有与邻接点u的low[u]最小值伪代码:...原创 2019-01-08 00:03:01 · 177 阅读 · 0 评论 -
生成树计数
#include<bits/stdc++.h>using namespace std;const int N=15;typedef long long LL;int degree[N];LL C[N][N];LL det(LL a[][N],int n){ LL ret=1; for(int i=1; i<n; i++){ for(i...原创 2019-01-10 13:28:09 · 400 阅读 · 0 评论 -
强连通
#include<bits/stdc++.h>using namespace std;struct node{ int v,next;}edge[1001];int dfn[1001],low[1001],cnt,tot,index;int stacks[1001],heads[1001],visit[1001];void add(int x,int y){ ...原创 2019-01-10 13:28:12 · 120 阅读 · 0 评论 -
起点到终点经过尽可能多的点
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+30;struct node{ int x,y;}a[maxn],b[maxn];int li[maxn],imin[maxn],cnt;bool cmp1(node i,node j){ ...原创 2019-01-10 13:28:14 · 630 阅读 · 0 评论 -
有上下界的网络流算法汇总
有上下界的网络流算法汇总零、预备知识f(u,v)表示u->v这条边的实际流量b(u,v)表示u->v这条边的流量下界c(u,v)表示u->v这条边的流量上界在无源汇普通网络流图中满足 在有上下界的网络流图中多了流量下界b(u,v)故需满足0≤f(u,v)≤c(u,v) 流量限制条件 b(u,v)≤f(u,v)≤c(u,v) 流量限制条件...原创 2018-12-31 00:34:09 · 1127 阅读 · 0 评论 -
Ford-Fulkerson增广路求最大流&最小割
#include <bits/stdc++.h>using namespace std;struct edge{int to,cap,rev;};vector<edge>g[100003];//图的邻接表bool used[100003];//DFS中用到的访问标记//向图中增加一条从S到T容量为CAP的边void add_edge(int from,int ...原创 2018-12-31 00:33:44 · 439 阅读 · 0 评论 -
差分约束
差分约束例题:给定n个变量和m个不等式,每个不等式形如 x[i] - x[j] <= a[k] (0 <= i, j < n, 0 <= k < m, a[k]已知),求 x[n-1] - x[0] 的最大值。例如当n = 4,m = 5,不等式组如图一-1-1所示的情况,求x3 - x0的最大值。 这个问题就是经典的最短路问题由于这个图比较简...原创 2019-01-06 11:21:59 · 112 阅读 · 0 评论 -
单调栈 单调队列 和 优先队列的应用
#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 10;struct node{ long long num; int pos;};node a[maxn];long long sum[maxn] = {0};int main(){ int n; scan...原创 2019-01-06 11:21:33 · 547 阅读 · 0 评论 -
最小直径生成树
#include<bits/stdc++.h>const int maxn=205,maxm=50010;using namespace std; int ans=(int)1e9;int n,m,d[maxn][maxn],inf,tot,rank[maxn][maxn];struct Edge{int x,y,v;}E[maxm];void floyd(){ //强行求...原创 2019-01-07 19:11:15 · 1024 阅读 · 0 评论 -
最大团&最大独立集
#include <bits/stdc++.h>using namespace std;const int SIZE = 55;int Graph[SIZE][SIZE];int inset[SIZE];//当前用到的的结点int cn,n;//当前的节点数量,总点数int bestn;//当前最大的节点数量void DFS( int i ){ if ( i &...原创 2019-01-07 19:11:18 · 440 阅读 · 0 评论 -
最小点权覆盖集
#include<bits/stdc++.h>#define find_min(a,b) a<b?a:busing namespace std;const int N = 2550;const int MAX = 100000;struct Edge{ int s,e,v,next;}edge[20*N];int dir[4][2]={-1,0, 1,0,...原创 2019-01-07 19:11:22 · 271 阅读 · 0 评论 -
最小费用流
#include<bits/stdc++.h>using namespace std;const int MAXV=10010;const int MAXM=10010;const int INF=1<<30;typedef pair<int,int> P;//第一个值是边权,第二个值是边终点struct edge{int to,cap,cost,...原创 2019-01-07 19:11:25 · 135 阅读 · 0 评论 -
最小路径覆盖问题
#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<iostream>#include<queue>using namespace std;typedef long long ll;const int N=...原创 2019-01-07 19:11:28 · 189 阅读 · 0 评论 -
最小环问题
#include <bits/stdc++.h>using namespace std;#define maxn 108#define INF 1<<24int dist[maxn][maxn], g[maxn][maxn];int n, m;void init(){ for ( int i=1; i<=n; ++i ) for...原创 2019-01-07 19:11:31 · 555 阅读 · 0 评论 -
最大生成树
# include <bits/stdc++.h># define pp make_pairusing namespace std;typedef long long LL;const int maxn = 1e6+30;const int N = 260000;const LL mod = 1e9+7;const int inf = 0x3f3f3f3f;vecto...原创 2019-01-07 19:11:34 · 1239 阅读 · 0 评论 -
最大权闭合子图(最小割)
最大权闭合子图(最小割)定义:有一个有向图,每一个点都有一个权值(可以为正或负或0),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合子图。如图:能选的子图有Ø,{4},{3,4},{2,4},{1,2,3,4},它们的权值分别为0,-1,5,-6,4.所以最大权闭合子图为{3,4},权值为5.解法:这个问题可以转化为最小割问题,用网络...原创 2019-01-07 19:11:37 · 365 阅读 · 0 评论 -
欧拉回路
#include <bits/stdc++.h>using namespace std;//判断连通性,然后判断度相同 int IN[1001];//入度 int par[1001],n,m;int find(int x);void unite(int x, int y);int find(int x) {return par[x] == x ? x : par[x...原创 2019-01-10 13:28:17 · 253 阅读 · 0 评论 -
哈密尔顿回路
#include<bits/stdc++.h>#define maxn 1000using namespace std;int n, nex[maxn+3], mp[maxn+3][maxn+3];//N个点,NEX存路径,MP邻接阵bool expend(int s){ memset(nex, -1, sizeof(nex)); int head = s, ...原创 2019-01-10 13:28:20 · 1739 阅读 · 0 评论 -
KM二分图最大边权匹配
#include <bits/stdc++.h>using namespace std;const int MAXN = 305;const int INF = 0x3f3f3f3f;int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度int ex_girl[MAXN]; // 每个妹子的期望值int ex_boy[MAXN]; ...原创 2019-01-10 13:28:22 · 206 阅读 · 0 评论 -
旅行商问题
旅行商问题原创 2018-12-22 17:02:20 · 284 阅读 · 0 评论 -
双连通分量解释
双连通分量解释原创 2018-12-18 00:01:37 · 2559 阅读 · 0 评论 -
prufer编码与Cayley公式
prufer编码与Cayley公式原创 2018-12-16 00:11:08 · 449 阅读 · 0 评论 -
舞蹈链
舞蹈链原创 2018-12-16 00:09:03 · 241 阅读 · 0 评论 -
Kruskal
Kruskal原创 2018-12-12 09:09:11 · 749 阅读 · 0 评论 -
Dinic解释
Dinic解释原创 2018-12-19 23:32:43 · 168 阅读 · 0 评论 -
Cayley定理
Cayley定理原创 2018-12-08 11:07:33 · 1659 阅读 · 0 评论 -
dijstra
dijstra原创 2018-12-08 10:22:08 · 180 阅读 · 0 评论 -
floyd
floyd原创 2018-12-08 09:47:18 · 114 阅读 · 0 评论 -
BFS
BFS原创 2018-12-07 23:44:12 · 2390 阅读 · 0 评论 -
01分数规划最优比率环
#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3fvector<int>g[1003];int road[1005][1005],val[1005];int vis[1005],ok,n,m;double bet[1005];void spfa(int u,double cnt)...原创 2019-01-09 01:28:40 · 131 阅读 · 0 评论 -
01分数规划普通Dinkelbach算法
#include<bits/stdc++.h>using namespace std;#define eps 1e-5double m[50000+10],w[50000+10];struct node{double num;int ord;} d[50000+10];bool cmp(node a,node b){return a.num>b.num;}i...原创 2019-01-09 01:28:44 · 1789 阅读 · 0 评论 -
点双连通
点双连通POI2008给N个点编号1-N,M条边,输出n个数,代表如果把第i个点去掉,将有多少对点不能互通。保证所有点连通,对点对时删掉的点也算。所以不是割点的点删掉之后答案是固定的。如果是割点的点的话我们只需要在tarjan里面加点东西就行了。就是说是割点就会分裂点集。我们记录一个siz,如果某个点可以搜到low比它的deep值大的点的话,显然是产生了一个分割后的连通块。动态乘以下即可...原创 2019-01-10 13:28:25 · 214 阅读 · 0 评论 -
Bellman-Ford
#include<bits/stdc++.h>using namespace std;struct edge{ int from,to,cost;};edge es[100]; //结构体存边int v,e,s; //顶点数、边数、起点编号int d[100]; //顶点S出发到所有点最短距bool find_negative_loop()...原创 2019-01-09 01:29:09 · 127 阅读 · 0 评论