zoukankan      html  css  js  c++  java
  • 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 }

    = =怒压代码

  • 相关阅读:
    拉格朗日乘数法
    线性判别分析(Linear Discriminant Analysis)
    有监督学习 和 无监督学习
    Jenkins入门知识
    vs技巧总结
    jenkins 神奇变量
    ubuntu12.04 折腾流水
    ubuntu 12.04 右上角的网络连接图标突然消失不见
    ubuntu 12.04 上网体验
    JIRA 初体验
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5765132.html
Copyright © 2011-2022 走看看