• SPOJ FASTFLOW网络流水题


    Dinic=bfs+dfs  = =

    用bfs算出到原点的最短路径(每条残存都算1)

    然后每次都跑两端只差1的路径跑dfs,并且一直跑到不能跑

    一个优化:如果一个点流出的量已经到流入量了就可以返回上一层楼(显然)

     1 #include <cstdio>
     2 #define INF 9223372036854775807
     3 int n,m,x,y,z,M=1;long long ans=0;
     4 int d[5001],l[5001],fir[5001],nex[60005],to[60005],wei[60005];
     5 int min(long long a,long long b){if(a<b) return a;else return b;}
     6 void add(int x,int y,int z){to[++M]=y;wei[M]=z;nex[M]=fir[x];fir[x]=M;}
     7 long long dfs(int now,long long flow)
     8 {
     9     if(now==n)
    10         return flow;
    11     long long used=0;
    12     for(int i=fir[now];i;i=nex[i])
    13         if(d[to[i]]==d[now]+1 && wei[i])
    14             {
    15                 int fl=dfs(to[i],min(flow-used,wei[i]));
    16                 wei[i]-=fl,wei[i^1]+=fl;
    17                 used+=fl;
    18                 if(used==flow)
    19                     return flow;
    20             }
    21     return used;
    22 }
    23 bool bfs()
    24 {
    25     int h=0,t=1;
    26     l[1]=1;d[1]=0;
    27     for(int i=2;i<=n;i++) d[i]=-1;
    28     while(h<t)
    29         for(int i=fir[l[++h]];i;i=nex[i])
    30         if(wei[i] && (d[to[i]]==-1))
    31             l[++t]=to[i],d[l[t]]=d[l[h]]+1;
    32     return d[n]+1;
    33 }
    34 int main()
    35 {
    36     for(scanf("%d%d",&n,&m);m;m--)
    37         scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
    38     while(bfs()) ans+=dfs(1,INF);
    39     printf("%lld
    ",ans);
    40     return 0;
    41 }

    = =怒压代码

  • 相关阅读:
    python的IDE(pycharm)安装以及简单配置
    python环境搭建(python2和python3共存)
    如何搭建samba服务?
    css 样式 文字过长 换行处理方法
    my97 日历控件
    myeclipse8.6 注册码
    (46) odoo核心文档分享
    (01-02) odoo8.0_Ubuntu14.04_nginx反代理设置
    (45) Manifest文件
    (44) odoo中的WebService
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5765132.html
Copyright © 2020-2023  润新知