Ford&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;

return true;

}

Vis[x]=1;

for(int i=0;i<n;i++)

{

if(Vis[i]==0)

{

if(F[x][i]<C[x][i])

if(DFS(i))

{

f.node[f.top].value=i;

f.node[f.top].dir=1;

f.top++;

return true;

break;

}

if(F[i][x]>0)

if(DFS(i))

{

f.node[f.top].value=i;

f.node[f.top].dir=0;

f.top++;

return true;

break;

}

}

}

return false;

}

void Solve()

{

int start;

memset(Vis,0,sizeof(Vis));

cin>>n;

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

cin>>C[i][j];

memset(F,0,sizeof(F));

cin>>start>>sink;

while(DFS(start))

{

f.node[f.top].value=0;

__int64 Min=MAXN;

for(int i=0;i<f.top;i++)

{

if(f.node[i].dir==1)

Min=min(Min,C[ f.node[i+1].value] [f.node[i].value]

-F[ f.node[i+1].value] [f.node[i].value]);

else

Min=min(Min, F[f.node[i].value][ f.node[i+1].value] );

}

for(int i=0;i<f.top;i++)

{

if(f.node[i].dir==1)

F[ f.node[i+1].value] [f.node[i].value]+=Min;

if(f.node[i].dir==0)

F[f.node[i].value][ f.node[i+1].value]-=Min;

}

memset(Vis,0,sizeof(Vis));

}

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<F[i][j]<<" ";

cout<<endl;

}

}

int main()

{

Solve();

return 0;

}

时间: 2024-10-01 05:22:08

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

最大流问题

真的,资料好多的,转载两个差不多了,但其实,我是读运筹学教程+算法竞赛入门经典训练指南读懂的. 比较全面的是輝夜の永遠亭写的,基本上的流程都介绍了,特别是比较写得很好. 当然博客园上也有人转载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

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

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

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

微软等数据结构+算法面试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,也被称为线段树或区间树)和树