最大流板子
来源:互联网 发布:java大数值类代码 编辑:程序博客网 时间:2024/06/05 10:19
#include<bits/stdc++.h>using namespace std;const int maxn = 10000;#define ll long long#define mod 10001 #define INF 1<<29 int s,t,level[maxn],head[maxn],cnt=0;int n,m; struct Node{int to,next,val;}edge[maxn*2];void init(){memset(level,-1,sizeof(level));memset(head,-1,sizeof(head));memset(edge,0,sizeof(edge));cnt=0;}void addedge(int from, int to, int val){edge[cnt].to = to;edge[cnt].next = head[from];edge[cnt].val = val;head[from] = cnt++;edge[cnt].to = from;edge[cnt].next = head[to];//反向边 edge[cnt].val = 0;head[to] = cnt++;}bool bfs(){ int front=1,end=0,q[maxn];q[++end]=s;//初始时把源点入队memset(level,-1,sizeof(level)); level[s] = 0;while(front<=end){int k = q[front];front++;for(int i=head[k];i!=-1;i=edge[i].next){//遍历所有点 int to = edge[i].to;if(level[to] == -1 && edge[i].val){//如果改点没有被分层并且k点与该点有边相连 则可以进行分层 level[to] = level[k]+1;q[++end]=to;//将该点入队 }}if(k == t)return true; //汇点在该分层中说明有增光 则可以进行dfs重新找路径 } return 0;//bfs分层后都没有到汇点 则已经没有增广路 }ll dfs(int now,int maxf){ if(now==t||maxf==0) return maxf; int ret=0; for(int k=head[now];k!=-1;k=edge[k].next){ int u=edge[k].to; if(level[u]==level[now]+1&&edge[k].val){ int f=dfs(u,min(edge[k].val,maxf-ret)); edge[k].val-=f; edge[k^1].val+=f; ret+=f; if(ret==maxf) return ret; } } if(ret==0) level[now]=0; return ret; } int main(){init();//构建网流量的图模型 s源 t 汇 int res = 0; while(bfs()){res += dfs(s,INF);} }
阅读全文
0 0
- 最大流板子
- 最大流的一些板子
- 最大流板子(Sap)
- 最小费用最大流(板子)
- poj1273 Drainage Ditches(最大流dinic板子)
- luogu3381【模板】最小费用最大流(zkw费用流板子)
- 网络流板子之 dinic板子
- RMQ板子 求区间最大最小值
- 网络流板子
- 板子
- 板子
- 网络流板子(良心)
- poj 1273 网络流板子题
- 草地排水 (码一下自己的网络流板子)
- 测试板子
- 板子总结
- 入手板子
- 新板子
- IDEA 突然找不到程序包问题
- vue跨域的session问题
- idea安装配置
- java中super关键字
- linux svn服务器搭建
- 最大流板子
- Java 数组
- Spring Boot 快速入门
- 手把手教你用Strace诊断问题
- 把数组排成最小的数
- 实现wpf listview listbox 隔行变色的简单方法
- spring中的AOP编程思想详解
- linux用户和组管理
- UDP MediaPlayer 组播 地址