ACM练级日志:最大流的FF算法、匈(N)牙(T)利(R)算法
2014-08-09 22:30
232 查看
最大流的FF算法似乎是最简单的,即使是之前没怎么接触最大流的我也照着标程两下就会了。
FF算法大约是这么一个过程:不断地寻找源点到汇点的增广路,找到一个是一个,找不到了,那就已经是最大流了。找增广路的时候,假设我在s,我就看看我能看见谁,看他走过没有,能不能给我带来增广路,如果能的话就太好了,我也回答我能带来增广路,同时一个流就产生了。当然也要弄一条反向边,方便这个算法后悔。
二分图匹配的匈牙利算法也一样,过去老不会写,现在其实两句话就能说明白: 对于每一个还没有对象的点,都问问你有没有增广路,在看我所在的点有没有增广路的时候,我就看看我能看见谁,如果这个家伙还没对象,那我们就在一起吧;如果你有对象了,我就看看你的对象有没有增广路,他要是有增广路,就让他增广去吧,我们在一起吧…… 总的来讲匈牙利算法就是一个NTR算法= =
贴一个自己用的模板
FF算法大约是这么一个过程:不断地寻找源点到汇点的增广路,找到一个是一个,找不到了,那就已经是最大流了。找增广路的时候,假设我在s,我就看看我能看见谁,看他走过没有,能不能给我带来增广路,如果能的话就太好了,我也回答我能带来增广路,同时一个流就产生了。当然也要弄一条反向边,方便这个算法后悔。
二分图匹配的匈牙利算法也一样,过去老不会写,现在其实两句话就能说明白: 对于每一个还没有对象的点,都问问你有没有增广路,在看我所在的点有没有增广路的时候,我就看看我能看见谁,如果这个家伙还没对象,那我们就在一起吧;如果你有对象了,我就看看你的对象有没有增广路,他要是有增广路,就让他增广去吧,我们在一起吧…… 总的来讲匈牙利算法就是一个NTR算法= =
贴一个自己用的模板
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int map[300][300]; int used[300]; int n,m; const int INF= 2147483647; int DFS(int s, int t, int f) { if(s==t) return f;//找到终点了,此时剩下的流量就是能获得的流量 int i; for(i=1;i<=n;i++) { if(map[s][i] >0 && used[i] ==0)//从s开始找 { used[i]=1; int d=DFS(i, t, min(f, map[s][i]));//问有没有增广路 if(d>0) { map[s][i] -=d; map[i][s] +=d; return d; } } } return 0; } int maxflow(int s, int t) { int flow=0; while(true) { memset(used, 0, sizeof(used)); int f= DFS(s,t, INF);//不断找s到t的增广路 if(f == 0) return flow; //找不到了就回去 flow += f;//找到一个流量f的就赚了 } } void init() { memset(map, 0, sizeof(map)); return ; } int main() { while(scanf("%d %d", &m, &n) != EOF) { init(); int k1,k2, cap; int i; for(i=1;i<=m;i++) { scanf("%d %d %d", &k1, &k2, &cap); map[k1][k2] += cap; } int ans=maxflow(1,n); printf("%d\n", ans); } //system("pause"); return 0; }
相关文章推荐
- Pku acm 1466 Girls and Boys数据结构题目解题报告(十七)---- 匈牙利算法求二分图的最大匹配
- 匈牙利算法求二分图的最大匹配----杭电ACM
- ACM练级日志:ACM2013 南京网络赛
- ACM练级日志:HDU 4735(ACM 成都网络赛) 重复覆盖与DLX
- ACM练级日志:可持久化线段树初级-POJ 2104
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- ACM练级日志:POJ 2318 叉积的简单应用
- ACM练级日志:HDU 4433 Locker
- ACM练级日志:HDU 4288 离散化
- ACM练级日志: CodeForces 414C 归并排序、逆序数和栈内存
- POJ3436--ACM Computer Factory--拆点EK算法求最大流
- ACM练级日志: POJ 1376
- ACM练级日志: POJ 1389
- ACM练级日志:“不作死就不会死” --HDU 4283 & 4284
- ACM练级日志:Treap个人用模板
- acm题目--正整数n的加法组合的最大乘积的超快算法
- ACM练级日志: POJ 2155、1151
- ACM练级日志:模板的使用
- ACM练级日志:POJ 3740 与Dancing Links
- ACM练级日志:POJ 2886 约瑟夫环,线段树和反素数