您的位置:首页 > 理论基础 > 计算机网络

网络流dinic模板

2015-10-20 19:45 621 查看
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#define ll long long
#define INF 0x3f3f3f3f
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
struct G{
int v,cap,next;
}E[600010];
int pre[1100],l,d[1100],p[1100];
int Q[1100];
void init(){
l=0;
memset(pre,-1,sizeof pre);
}
void add(int u,int v,int cap){
E[l].v=v;
E[l].cap=cap;
E[l].next=pre[u];
pre[u]=l++;
}
bool bfs(int s,int e,int n){
int i,u,v,head,tail;
for(i=0;i<=n;i++)d[i]=-1;
head=tail=0;
d[s]=0;
Q[tail]=s;
while(head<=tail){
u=Q[head++];
for(i=pre[u];i+1;i=E[i].next){
v=E[i].v;
if(d[v]==-1&&E[i].cap>0){
d[v]=d[u]+1;
Q[++tail]=v;
}
}
}
return (d[e]!=-1);
}
int dfs(int u,int &e,int f){
if(u==e||f==0)return f;
int flow=0,tmp;
for(;p[u]+1;p[u]=E[p[u]].next){
G& en=E[p[u]];
if(d[u]+1==d[en.v]){
tmp=dfs(en.v,e,min(f,en.cap));
if(tmp>0){
en.cap-=tmp;
E[p[u]^1].cap+=tmp;
flow+=tmp;
f-=tmp;
if(f==0)break;
}
}
}
return flow;
}
int dinic(int s,int e,int n){
int i,ans=0;
while(bfs(s,e,n)){
for(i=0;i<=n;i++)p[i]=pre[i];
ans+=dfs(s,e,INF);
}
return ans;
}
int x,y,w;
int main()
{
int n,m;
while(cin>>m>>n){
init();
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,0);
}
printf("%d\n",dinic(1,n,n));
//源点1汇点n
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: