网络流想必大家都知道,在这不过多赘述。网络流中有一类问题是让你求最大流,关于这个问题,许多计算机学家给出了许多不同的算法,在这里——正如标题所说——我们只介绍其中的一种——\(\tt{Dinic}\)

Dinic是最大流算法中综合性能比较好的一个算法,它的思想继承\(Ford-Fulkerson\)算法,但对FF算法有了很大的一个改进。Dinic通过分层图大大提高了算法效率,减少了许多不必要的搜索。

例题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct zzz{
    int t,len,nex;
}e[100010<<2]; int head[10010],tot=1;
void add(int x,int y,int z){
    e[++tot].t=y;
    e[tot].len=z;
    e[tot].nex=head[x];
    head[x]=tot;
}
int vis[10010],s,t;
//每次搜索前跑一遍分层图
bool bfs(){
    queue <int> q;
    memset(vis,0,sizeof(vis));
    q.push(s); vis[s]=1;
    while(!q.empty()){
        int k=q.front(); q.pop();
        for(int i=head[k];i;i=e[i].nex){
            int to=e[i].t;
            if(!vis[to]&&e[i].len){
                q.push(to);
                vis[to]=vis[k]+1;
                if(to==t) return 1;
            }
        }
    }
    return vis[t];
}
//寻找增广路径
int dfs(int from,int flow){
    if(from==t||!flow) return flow;
    int rest=0,fl;
    for(int i=head[from];i;i=e[i].nex){
        int to=e[i].t;
        if(vis[to]==vis[from]+1&&(fl=dfs(to,min(flow-rest,e[i].len)))){
            e[i].len-=fl;
            e[i^1].len+=fl;
            rest+=fl;
            if(rest==flow) return flow;
        }
    }
    if(rest<flow)
      vis[from]=0;
    return rest;
}
//dinic
int dinic(){
    int ans=0;
    while(bfs())
      ans+=dfs(s,0x7ffffff);
    return ans;
}
inline int read()
{
    int k=0; char c=getchar();
    for(;c<'0'||c>'9';) c=getchar();
    for(;c>='0'&&c<='9';c=getchar())
      k=(k<<3)+(k<<1)+c-48;
    return k;
}
int main(){
    int n=read(),m=read();
    s=read(),t=read();
    for(int i=1;i<=m;i++){
        int x=read(),y=read(),z=read();
        add(x,y,z); add(y,x,0);
    }
    printf("%d",dinic());
    return 0;
}

最新文章

  1. c# DataGridView 的一些属性设置,序号,合并头
  2. CSS使用自定义光标样式-遁地龙卷风
  3. BZOJ1202 狡猾的商人
  4. NOI2010超级钢琴 2
  5. 【转】(DT系列二)device tree的书写规范
  6. Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 下
  7. UEditor用法
  8. Bcdedit命令使用详解使用方法
  9. 手机管家iPhoneX的适配总结
  10. PHP flock() 函数
  11. 《Thinking in Java》学习笔记(六)
  12. LNMP+FARM+DNS
  13. java知识点总结--java数据类型
  14. MySQL 性能调优之SQL
  15. Zk 集群概念
  16. mimkatz 用法
  17. linux降低内存后oracle数据库无法启动
  18. 20155326刘美岑 2016-2017-2 《Java程序设计》第5周学习总结
  19. 创建 React-Native 工程时,如何指定特定的 React-Native 版本
  20. thinkphp 实现rabbitMq常驻进程消费队列

热门文章

  1. [Xcode 实际操作]九、实用进阶-(1)隐藏顶部的状态栏
  2. Html5shiv ---- 让IE低版本浏览器识别并支持HTML5标签
  3. XHTML学习笔记 Part3:核心属性
  4. SpiderMonkey 入门学习(一)
  5. java操作redis实现和mysql数据库的交互
  6. DWR+Spring配置使用
  7. ajax中get和post区别
  8. 551 Student Attendance Record I 学生出勤纪录 I
  9. vue http请求 vue-resource使用方法
  10. shell脚本解析json文件