写法:
(1)用邻接矩阵存储各个流的起点终点
(2)用BFS把图分出层次(记录到各个点需要流几次)
(3)用DFS对图找出增广路进行流量扩充
注意反向流要记录成容量为0的路径,更新正向流时也要更新反向流(教材361页)
#include<iostream>
using namespace std;
struct Edge
{
int cap, flow;
};
Edge edges[50][50];
int size = 6;
int visit[100], s = 0, t = 5;
int q[1000], d[1000];
void init()
{
for(int i = 0; i < size; i++)
{
visit[i] = 0; d[i] = 0;
for(int j = 0; j < size; j++)
{
edges[i][j].cap = -1; edges[i][j].flow = 0;
}
}
edges[0][1].cap = 10; edges[1][0].cap = 0;
edges[0][2].cap = 10; edges[2][0].cap = 0;
edges[1][3].cap = 4; edges[3][1].cap = 0;
edges[3][5].cap = 10; edges[5][3].cap = 0;
edges[1][4].cap = 8; edges[4][1].cap = 0;
edges[4][5].cap = 10; edges[5][4].cap = 0;
edges[2][4].cap = 9; edges[4][2].cap = 0;
}
int BFS()
{
int i, front, tail,temp;
bool flag;
for(i = 0; i < size; i++)
{
visit[i] = 0;
}
front = 0; tail = 1;
q[front] = s;
visit[0] = 1; d[0] = 0;
while(front < tail)
{
temp = q[front];
front++;
flag = true;
for(i = 0; i < size; i++)
{
if(!visit[i] && edges[temp][i].cap > edges[temp][i].flow)
{
q[tail] = i;
d[i] = d[temp] + 1;
visit[i] = 1;
if(i == t)
{
flag = false;
}
tail++;
}
}
if(!flag)
break;
}
return visit[t];
}
int DFS(int pos, int in)
{
if(in == 0 || pos == t) return in;
int flow = 0, temp, temp1 = in, f;
for(int i = 0; i < size; i++)
{
if(d[i] == d[pos] + 1 && edges[pos][i].cap > edges[pos][i].flow)
{
temp = edges[pos][i].cap - edges[pos][i].flow;
if(temp < temp1)
f = DFS(i, temp);
else
f = DFS(i, temp1);
edges[pos][i].flow += f;
edges[i][pos].flow -= f;
flow += f;
temp1 -= f;
if(temp1 == 0)
break;
}
}
return flow;
}
int maxFlow()
{
init();
int flow = 0;
while(BFS())
{
flow += DFS(s, 100000);
}
return flow;
}
int main()
{
cout << maxFlow() << endl;
}