最大流问题的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 ...
随机推荐
- php导出pdf,dompdf中文字体乱码解决办法(特别是代码迁移引起的乱码)
dompdf\lib\fonts\dompdf_font_family_cache.php记住这个文件里面存放的是字体生成的缓存,迁移时如果覆盖了这个文件会导致乱码而且很难找到出错的地方,相信我... ...
- 日常Java 2021/9/27
题目: 在某个比赛中,有6个评委为参赛的选手打分,分数为1-100的随机整数.选手的最后得分为:除去最高分和最低分后的4个评委分值的平均值(不考虑小数部分). package m; import ja ...
- Centos7部署RabbitMQ的镜像队列集群
一.背景 在上一章节中,我们学会了如何搭建一个单节点的RabbitMQ服务器,但是单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用.此处我们搭建一个3个节点的RabbitMQ集群 ...
- Scala(三)【函数式编程】
目录 一.方法和函数 1.方法 1)基本语法 2)简化原则 3)方法参数 2.函数 3.方法和函数的区别 二.高阶函数 三.匿名函数 四.柯里化 五.闭包 一.方法和函数 1.方法 1)基本语法 de ...
- 在JTable单元格上 加入组件,并赋予可编辑能力 [转]
表格(单元格放置组件) 对于JTable单元格的渲染主要是通过两个接口来实现的,一个是TableCellRenderer另一个是TableCellEditor,JTable默认是用的是DefaultC ...
- Linux磁盘分区(一)之fdisk命令
Linux磁盘分区(一)之fdisk命令转自:https://www.cnblogs.com/machangwei-8/p/10353683.html 一.fdisk 的介绍fdsik 能划分磁盘成为 ...
- 数据源(Data Source
数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体.在数据源中存储了所有建立数据库连接的信息.就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数 ...
- Dubbo多协议支持
除了Dubbo服务暴露协议Dubbo协议外,Dubbo框架还支持另外8种服务暴露协议:RMI协议.Hessian协议.HTTP协议.WebService协议.Thrift协议.Memcached协议. ...
- window安装ab压力测试
ab是Apache HTTP server benchmarking tool的缩写,可以用以测试HTTP请求的服务器性能,也是业界比较流行和简单易用的一种压力测试工具包 ## 下载 下载地址:(ht ...
- jquery:iframe里面的元素怎样触发父窗口元素的事件?
例如父窗口定义了一个事件. top: $(dom1).bind('topEvent', function(){}); 那么iframe里面的元素怎样触发父窗口dom1的事件呢?这样吗? $(dom1, ...