热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dinic

1#include2#include3#include4#include5#include6#include7usingnamespacestd;89constintN210;10
,,
 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 using namespace std;
 8 
 9 const int N = 210;
10 const int M=1001000;
11 const int INF = 1001001010;
12 struct edge{
13     int u,v,cap,flow;
14     int next;
15 
16     //////
17 }e[M];
18 int head[N],num;
19 int cur[N],d[N];
20 bool vis[N];
21 int s,t;
22 void _add(int u,int v,int cap){
23     e[num].u = u;e[num].v = v;
24     e[num].cap = cap;e[num].flow = 0;
25     e[num].next = head[u];
26 
27     //////
28     head[u] = num++;
29 }
30 
31 void add(int u,int v,int cap){
32     _add(u,v,cap); _add(v,u,0);
33 }
34 
35 bool BFS(){
36     memset(vis,0,sizeof(vis));
37     queue<int> Q;
38     Q.push(s);
39     d[s] = 0;
40     vis[s]=1;
41     while(!Q.empty()){
42         int x = Q.front(); Q.pop();
43         for(int i = head[x]; i != -1;i = e[i].next){
44             if(!vis[e[i].v] && e[i].cap > e[i].flow ){
45                 vis[e[i].v] = 1;
46                 d[e[i].v] = d[x] + 1;
47                 Q.push(e[i].v);
48             }
49         }
50     }
51     return vis[t];
52 }
53 
54 int DFS(int x, int a){
55     if(x == t || a == 0) return a;
56     int flow=0,f;
57 
58     for(int &i = cur[x]; i != -1; i = e[i].next){
59         if(d[x] + 1 == d[e[i].v] && (f = DFS(e[i].v, min(a, e[i].cap - e[i].flow))) > 0){
60             e[i].flow += f;
61             e[i ^ 1].flow -= f;
62             flow += f;
63             a -= f;
64             if(a == 0)break;
65         }
66     }
67     return flow;
68 }
69 int Dinic(){
70     int flow = 0;
71     while(BFS()){
72         memcpy(cur,head,sizeof(head));
73         flow += DFS(s,INF);
74     }
75     return flow;
76 }
77 void init(int n){
78     memset(head,-1,sizeof(head));
79     num=0;
80 }
Dinic

无源无汇有下界可行流

t -> s 连一条 INF cap。

对于 边 u -> v ,下界 c1 ,上界 c2:

  s -> v    c1 

  u -> t    c1 

  u -> v   c2-c1

存在可行流的满足条件是 所有附加弧满载

Dinic


推荐阅读
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 以下实例展示了locals( ... [详细]
  • andr ... [详细]
author-avatar
mobiledu2502911637
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有