dinic模板

来源:互联网 发布:人工智能的细分领域 编辑:程序博客网 时间:2024/06/14 14:40
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;int n,m;const int inf=1e9;const int N=1e5+5;int dis[N],q[N],head[N],next[N],go[N],val[N];int tot=1;int cur[N];inline bool bfs(){    int t=0,w=1;    memset(dis,-1,sizeof(dis));    q[1]=1,dis[1]=0;    while (t<w)    {        int x=q[++t];        for(int i=head[x];i;i=next[i])        {            int v=go[i];            if (val[i]&&dis[v]==-1)            {                dis[v]=dis[x]+1;                q[++w]=v;            }        }    }    if (dis[n]==-1)return 0;    return 1;}inline int dfs(int x,int f){    if (x==n)return f;    int w,used=0;    for(int i=head[x];i;i=next[i])    {        int v=go[i];        if (val[i]&&dis[v]==dis[x]+1)        {            w=dfs(v,min(f-used,val[i]));            used+=w;            val[i]-=w;            val[i^1]+=w;            if (used==f)return f;        }    }    if (!used)dis[x]=-1;    return used;}inline int dinic(){    int ans=0;    while (bfs())    {        memcpy(cur,head,sizeof(cur));        ans+=dfs(1,inf);    }    return ans;}inline void add(int x,int y,int z){    go[++tot]=y,val[tot]=z,next[tot]=head[x];    head[x]=tot;}int main(){    scanf("%d%d",&m,&n);    fo(i,1,m)    {        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        add(x,y,z);        add(y,x,0);    }    printf("%d\n",dinic());    return 0;}
0 0
原创粉丝点击