最大流问题的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 }
时间: 2024-10-06 20:53:33

最大流问题的Ford-Fulkerson模板的相关文章

ACM/ICPC 之 网络流入门-Ford Fulkerson(POJ1149)

按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47Ms Memory:276K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #def

Ford&amp;Fulkerson 最大流问题

#include<iostream> using namespace std; #define MAXN 10000003 int n,sink; bool Vis[100]; __int64 C[100][100],F[100][100]; struct list { int value; bool dir; }; struct stack { int top; list node[100]; }f; bool DFS(int x) { if(x==sink) { f.top=0; retu

最大流问题

真的,资料好多的,转载两个差不多了,但其实,我是读运筹学教程+算法竞赛入门经典训练指南读懂的. 比较全面的是輝夜の永遠亭写的,基本上的流程都介绍了,特别是比较写得很好. 当然博客园上也有人转载http://www.cnblogs.com/longdouhzt/archive/2012/05/20/2510753.html 主要涉及以下: 1. Ford - Fulkerson 方法 2. Edmonds - Karp 算法 3. Dinic 算法 4. Improved SAP 算法 ... 7

POSIX 线程详解(2-线程创建和销毁)

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

Maximum Bipartite Matching

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

hdu 3549 Flow Problem (网络最大流)

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 6674    Accepted Submission(s): 3112 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, yo

【编程题目】对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一

45.雅虎(运算.矩阵):1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到. 这道题,是我目前为止做过的最最最最最麻烦.最繁琐的题目了. 思路: 把输入的矩阵一步步还原成 0 矩阵 一个数字,只可能伴随着它上下左右四个方向的数字变化. ①如果数字比它周围四个数的和要大,那么一定不满足条件. ②如果数字小于等于四周的数字和,且其四周仅有一个数字不为0: 不为0的那个周围数字的大小 -=

微软等数据结构+算法面试100题全部答案集锦

1.把二元查找树转变成排序的双向链表. 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 10  / \  6 14  / \ / \  4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode  {  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child

搞定编程大赛必知哪10个算法?

再没有比算法更让人头疼的东西了吧! 前两天参加了一个编程大赛http://www.ijiami.cn/newsInfo?id=519&v=2,有感于算法,所以整理了这篇关于编程竞赛的10个算法. 动态规划(DP)似乎占据了大部分的编程竞赛题目,乃至三分之一.当然,DP也不是一个学一次就Ok的单一算法. 这还取决于你是否把数据结构与算法放在同一个等级中考虑.如果你想要在编程竞赛中一展风采的话,当然,有些数据结构是你应该熟悉的.其中最重要的有范围树(Range Tree,也被称为线段树或区间树)和树