hrbust 1491 游河 最大流 dinic模板

来源:互联网 发布:虚拟机系统安装linux 编辑:程序博客网 时间:2024/06/18 12:21

                  HRBUST 1491 游河 点击打开链接

最大流讲解:点击打开链接

第一次看网络流,看了一上午,总算看出点毛头。。。。

接下来就是刷题巩固找毛病了。。。

这道题完全是一道模板题,不过第一次写,写模板写了半天  - -!

我们把每条道都看成容量为1的管道,这样求得的最大流就是答案。

代码:

#include<stdio.h>#include<iostream>#include<map>#include<string.h>#include<queue>#include<algorithm>using namespace std;#define inf 0x3f3f3f3fint dis[500];int flow[500][500];int n,m,d;int bfs(){    memset(dis,-1,sizeof(dis));    dis[1]=0;    queue<int>Q;    Q.push(1);    while(!Q.empty())    {        int top=Q.front();        Q.pop();        for(int i=1; i<=n; i++)        {            if(flow[top][i]>0&&dis[i]<0)            {                dis[i]=dis[top]+1;                Q.push(i);            }        }    }    if(dis[n]>0)        return 1;    return 0;}int dinic(int x,int y){    int fl;    if(x==n)        return y;    for(int i=1; i<=n; i++)    {        if(flow[x][i]>0&&dis[i]==dis[x]+1&&(fl=dinic(i,min(y,flow[x][i]))))        {            flow[x][i]-=fl;            flow[i][x]+=fl;            return fl;        }    }    return 0;}int main(){    while(~scanf("%d%d%d",&n,&m,&d))    {        memset(flow,0,sizeof(flow));        int a,b;        for(int i=0; i<m; i++)        {            scanf("%d%d",&a,&b);            flow[a][b]=1;            flow[b][a]=1;        }        int ans=0;        while(bfs())        {            int res;            while(res=dinic(1,inf))ans+=res;        }       if(ans>=d)        printf("Orz!\n");       else       {           printf("Jiao Zhu v5!\n");       }    }}