dinic 板子

来源:互联网 发布:java大学教程 pdf 编辑:程序博客网 时间:2024/05/17 07:26
#include <iostream>#include<stdio.h>#include<string.h>#include<string>#include<queue>using namespace std;const int maxn=99999;const int inf=999999999;int to[maxn];int head[maxn];int next[maxn];int value[maxn];int tot;int src,sink;void init(){   tot=0;   memset(head,-1,sizeof(head));}void addedge(int u,int v,int w){    to[tot]=v;    next[tot]=head[u];    value[tot]=w;    head[u]=tot++;}int dis[maxn];int vis[maxn];queue<int>que;void bfs(){    memset(dis,0,sizeof(dis));    while(!que.empty())      que.pop();    vis[src]=true;    que.push(src);    while(!que.empty())    {        int u=que.front();        que.pop();        for(int i=head[u];i!=-1;i=next[i])        {            if(value[i]>0&&vis[to[i]]==0)            {                que.push(to[i]);                dis[to[i]]=dis[u]+1;                vis[to[i]]=true;            }        }    }}int dfs(int u,int delta)//rc  源点 sink  汇点{    if(u==sink)    {        return delta;    }    int ret=0;    for(int i=head[u];i!=-1&δi=next[i])    {        if(value[i]>0&&dis[to[i]]==dis[u]+1)        {            int dd=dfs(to[i],min(value[i],delta));            value[i]-=dd;            value[i^1]+=dd;            delta-=dd;            ret+=dd;        }    }    return ret;}int maxflow(){    int ret=0;    while(true)    {        memset(vis,0,sizeof(vis));        bfs();        if(!vis[sink])            return ret;        ret+=dfs(src,inf);    }    return 0;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        for(int i=1;i<=n;i++)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            addedge(a,b,c);            addedge(b,a,0);        }        src=1;        sink=m;        printf("%d\n",maxflow());    }    return 0;}

0 0
原创粉丝点击