#include "iostream"
#include "stack"
#include "vector"
#include "string.h"
#define min(x, y) x < y ? x : y
using namespace std;
struct Edge
{
int to; //终点
int cap; //容量
int rev; //反向边
};
const int MAX_V = 100;
const int MAX_INT = 10000;
vector<Edge> G[MAX_V]; //图的邻接表
int visit[MAX_V]; //访问标记
void addEdge(int from, int to, int cap)
{
Edge E;
E.to = to;
E.cap = cap;
E.rev = G[to].size();
G[from].push_back(E);
Edge rE;
rE.to = from;
rE.cap = 0;
rE.rev = G[from].size() - 1;
G[to].push_back(rE);
}
//寻找增广路
int dfs(int v, int t, int f)
{
if(v == t)
return f;
visit[v] = 1;
for(int i=0; i<G[v].size(); i++)
{
Edge &E = G[v][i];
if(!visit[E.to] && E.cap > 0)
{
int d = dfs(E.to, t, min(f, E.cap));
if(d > 0)
{
E.cap -= d;
G[E.to][E.rev].cap += d;
return d;
}
}
}
return 0;
}
//寻找从s到t的最大流
int max_flow(int s, int t)
{
int flow = 0;
for(;;)
{
memset(visit, 0, sizeof(visit));
int f = dfs(s, t, MAX_INT);
if(f == 0)
return flow;
flow += f;
}
}
int main()
{
addEdge(0, 1, 10);
addEdge(0, 2, 2);
addEdge(1, 2, 6);
addEdge(1, 3, 6);
addEdge(2, 4, 5);
addEdge(3, 2, 5);
addEdge(3, 4, 8);
cout << "最大流为:" << max_flow(0, 4) << endl;
return 0;
}
最大流
最新推荐文章于 2021-09-06 21:49:32 发布