zoukankan      html  css  js  c++  java
  • 网络流dinic实现总结

    太羞耻了,搞了半天居然没发现自己写的不是dinic,直到被一道时限紧的题目卡掉才发现

     1 int dfs(int now,int flow,int sum)
     2 {
     3     if(now==n) return flow;
     4     for(int i=fir[now];i && (flow>sum);i=nex[i])
     5         if(d[to[i]]==d[now]+1 && flo[i])
     6             zl=dfs(to[i],min(flow,flo[i]),0),sum+=zl,flo[i]-=zl,flo[i^1]+=zl;
     7     if(sum==0) d[now]=0;
     8     return sum;    
     9 }
    10 bool bfs()
    11 {
    12     for(int i=1;i<=n;i++) d[i]=0;
    13     for(h=1,t=1,l[1]=0,d[0]=1;h<=t;h++)
    14         for(int i=fir[l[h]];i;i=nex[i])
    15             if(!d[to[i]] && flo[i])
    16                 l[++t]=to[i],d[l[t]]=d[l[h]]+1;
    17     return d[n];
    18 }

    俗话说dinic=bfs+dfs,bfs和dfs各写9行真是和谐美妙啊

    有几处地方保证了复杂度的优化:

    1.在总流量达到限制时直接滚粗

    2.如果从一个节点无法流到终点,那么就暂时无视这个点(直到重新标号)——一开始一直没写

    在调用的时候可以直接写

    1 for(ans=0;bfs();ans+=dfs(0,INF,0));

    不要手贱在ans前面加int,又一次我搞半天都只能输出0,结果发现╮(╯▽╰)╭

    ——另外不是很理解网上把残余流量和流量分开写的方法,感觉有点冗余

    未完待续

  • 相关阅读:
    最短母串
    noip模拟测试7
    linux下的对拍程序
    noip模拟测试6
    QWidget 前后位置设定
    C++编程规范_第5~13条 设计风格
    random /timer/sort 示例代码
    资料准备
    【转】三维动态数组 分配与释放
    批量修改文件名
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5818572.html
Copyright © 2011-2022 走看看