最大流板子

来源:互联网 发布: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);} }

原创粉丝点击