最大流问题的Ford-Fulkerson模板
详细讲解:http://blog.csdn.net/smartxxyx/article/details/9293665
下面贴上我的第一道最大流的题:
hdu3549
1 #include<stdio.h>
2 #include<algorithm>
3 #include<stdlib.h>
4 #include<iostream>
5 #include<string.h>
6 #include<math.h>
7 #include<vector>
8 #include<map>
9 #include<queue>
10 struct pp
11 {
12 int x;
13 int cap;
14 int pre;
15 };
16 const int N=1e8;
17 bool used[30];
18 using namespace std;
19 vector<pp>GG[30];
20 void add(int from,int to,int vv)
21 { pp ss;
22 ss.cap=vv;ss.x=to;ss.pre=GG[to].size();
23 GG[from].push_back(ss);
24 ss.cap=0;ss.x=from;ss.pre=GG[from].size()-1;
25 GG[to].push_back(ss);
26 }
27 int dfs(int x,int y,int co)
28 {
29 if(x==y)
30 {
31 return co;
32 }
33 used[x]=true;
34 int i,j;
35 for(i=0;i<GG[x].size();i++)
36 { int cc ;
37 pp &LL=GG[x][i];
38 if(!used[LL.x]&&LL.cap>0)
39 {
40 cc=dfs(LL.x,y,min(co,LL.cap));
41 if(cc>0)
42 {
43 LL.cap-=cc;
44 GG[LL.x][LL.pre].cap+=cc;
45 return cc;
46 }
47 }
48 }
49 return 0;
50 }
51 int max_flow(int x,int t)
52 {
53 int flow=0;
54 while(1)
55 {memset(used,0,sizeof(used));
56 int kk=dfs(x,t,N);
57 if(kk==0)
58 {
59 return flow;
60 }
61 else flow+=kk;
62 }
63
64 }
65 int main(void)
66 {
67 int i,j,k,p,q;
68 scanf("%d",&k);
69
70 for(i=1;i<=k;i++)
71 { for(j=0;j<30;j++)
72 GG[j].clear();
73 scanf("%d %d",&p,&q);
74 int x;int y;int n,m;
75 for(j=0;j<q;j++)
76 {
77 scanf("%d %d %d",&x,&y,&n);
78 add(x,y,n);
79 }
80 int M=max_flow(1,p);
81 printf("Case %d: %d\n",i,M);
82 }
83 return 0;
84 }
DINIC算法
1 #include<stdio.h>
2 #include<algorithm>
3 #include<stdlib.h>
4 #include<iostream>
5 #include<string.h>
6 #include<math.h>
7 #include<vector>
8 #include<map>
9 #include<queue>
10 using namespace std;
11 struct node
12 {
13 int to;
14 int cap;
15 int rev;
16 };
17 int level[20];
18 int iter[20];
19 vector<node>vec[20];
20 void add_edge(int from,int to,int cap )
21 {
22 vec[from].push_back(node {to,cap,vec[to].size()});
23 vec[to].push_back(node {from,0,vec[from].size()-1});
24 }
25 void BFS(int s);
26 int dfs(int id,int t,int f );
27 int max_flow(int s,int t);
28 const int N=1e9;
29 int main(void)
30 {
31 int i,j,k,p,q;
32 int x,y;
33 scanf("%d",&k);
34 int s;
35 for(s=1; s<=k; s++)
36 {
37 scanf("%d %d",&p,&q);
38 for(i=0;i<20;i++)
39 {
40 vec[i].clear();
41 }
42 for(i=0; i<q; i++)
43 {
44 int z;
45 scanf("%d %d %d",&x,&y,&z);
46 add_edge(x,y,z);
47 }
48 int sum=max_flow(1,p);
49 printf("Case %d: ",s);
50 printf("%d\n",sum);
51 }
52 return 0;
53 }
54 void BFS(int s)
55 {
56 memset(level,-1,sizeof(level));
57 queue<int>que;
58 level[s]=0;
59 que.push(s);
60 while(!que.empty())
61 {
62 int id=que.front();
63 que.pop();
64 for(int i=0; i<vec[id].size(); i++)
65 {
66 node x=vec[id][i];
67 if(level[x.to]<0&&x.cap>0)
68 {
69 level[x.to]=level[id]+1;
70 que.push(x.to);
71 }
72 }
73 }
74 }
75 int dfs(int id,int t,int f )
76 {
77 if(t==id)return f;
78 for(int &i=iter[id]; i<vec[id].size(); i++)
79 {
80 node &vv=vec[id][i];
81 if(level[vv.to]>level[id]&&vv.cap>0)
82 {
83 int d=dfs(vv.to,t,min(f,vv.cap));
84 if(d>0)
85 {
86 vv.cap-=d;
87 vec[vv.to][vv.rev].cap+=d;
88 return d;
89 }
90 }
91 }
92 return 0;
93 }
94 int max_flow(int s,int t)
95 {
96 int flow=0;
97 for(;;)
98 {
99 BFS(s);
100 if(level[t]<0)
101 {
102 return flow;
103 }
104 int f=0;
105 memset(iter,0,sizeof(iter));
106 while( (f=dfs(s,t,N))>0)
107 {
108 if(f==0)break;
109 flow+=f;
110 }
111 }
112 }
最大流问题的Ford-Fulkerson模板的更多相关文章
- ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...
- 图的匹配问题与最大流问题(三)——最大流问题Ford-Fulkerson方法Java实现
上篇文章主要介绍了Ford-Fulkerson方法的理论基础,本篇给出一种Java的实现. 先借助伪代码熟悉下流程 FORD-FULKERSON(G,t,s) 1 for each edge(u,v) ...
- 【题解】luogu P3386 【模板】二分图匹配
题面:https://www.luogu.org/problemnew/show/P3386 好像没有人发Ford-Fulkerson,我来一发, 这道题和P2756飞行员配对方案问题方法一样,网络流 ...
- [Algorithm] Maximum Flow
Ref MIT: lecture-13-incremental-improvement-max-flow-min-cut/ Ford Fulkerson algorithm for finding m ...
- hdu 3549 Flow Problem (网络最大流)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- poj 1273 Drainage Ditches(最大流,E-K算法)
一.Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clove ...
- Maximum Bipartite Matching
算法旨在用尽可能简单的思路解决这个问题.理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时最好还是从样例入手.通过一个简单的样例,并编程实现,这个过程 ...
- Python小白的数学建模课-19.网络流优化问题
流在生活中十分常见,例如交通系统中的人流.车流.物流,供水管网中的水流,金融系统中的现金流,网络中的信息流.网络流优化问题是基本的网络优化问题,应用非常广泛. 网络流优化问题最重要的指标是边的成本和容 ...
- 图割Graph-Cut的最大流实现
利用最大流标号法求解最大流,详见代码: Version:未加头尾节点版: 缺点:havn't take nodes' pixels into consideration /************** ...
- 《算法》第六章部分程序 part 5
▶ 书中第六章部分程序,包括在加上自己补充的代码,网络最大流 Ford - Fulkerson 算法,以及用到的流量边类和剩余流量网络类 ● 网络最大流 Ford - Fulkerson 算法 pac ...
随机推荐
- 巩固javaweb第十四天
巩固内容: 单行文本框: 单行文本框的基本语法格式如下: < input type="text" name="输入信息的字" value=" ...
- Typora数学公式输入指导手册
Markdown 公式指导手册 公式大全的链接 https://www.zybuluo.com/codeep/note/163962#mjx-eqn-eqsample 目录 Markdown 公式指导 ...
- CPU 是如何认识和执行代码的
CPU的介绍 CPU 也称为微处理器,是计算机的心脏和/或大脑. 深入研究计算机的核心,可以帮助我们有效地编写计算机程序. CPU 是计算机的心脏和大脑,它执行提供给他们的指令.它的主要工作是执行算术 ...
- 安全相关,xss
XSS XSS,即 Cross Site Script,中译是跨站脚本攻击:其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS. ...
- C++之数组转换
题目如下: 这道题经过好久的思考也没找到能一次性输入两组数的方法,只能一次性处理一组数,所以就把代码放上来,欢迎交流留言一起讨论可以放两组数的方法~(QQ 841587906) 1 #include ...
- Handler与多线程
1.Handler介绍 在Android开发中,我们常会使用单独的线程来完成某些操作,比如用一个线程来完成从网络上下的图片,然后显示在一个ImageView上,在多线程操作时,Android中必须保证 ...
- MySQL(4):卸载MySQL
MySQL的安装是比较复杂的,一旦安装出现错误或者出现其他问题,我们想要完全卸载MySQL也是非常麻烦的,下面简单说下怎样可以完全干净的卸载MySQL 卸载步骤 第一步:用管理员的身份打开命令窗口,关 ...
- BigDecimal 计算注意事项
BigDecimal 在进行除法运算(divide)时一定要注意:如果被除数为变量,一定要指定精度 和 舍入模式,否则会报:Non-terminating decimal expansion; no ...
- 【Spring Framework】Spring入门教程(四)注册Bean到IOC容器
注册Bean到IOC容器大致分为4种: ①.包扫描+组件注解(@Controller.@Service.@Repository.@Component) 针对类是我们自己编写的情况 ②.@Bean注解 ...
- 【Spring Framework】Spring入门教程(七)Spring 事件
内置事件 Spring中的事件是一个ApplicationEvent类的子类,由实现ApplicationEventPublisherAware接口的类发送,实现ApplicationListener ...