最大流基础题。基本的思路是:先找增广路,路上的流量减掉,反流量(名字忘记了)加上,直到找不到增广路。
#include <cstdio>
#include <cstring>
#include <queue>
#include <climits>
using std::queue;
using std::memset;
const int MAX = 400;
int flow[MAX][MAX];
int father[MAX];
bool visit[MAX];
int n,m;
int ford_fulkerson()
{
int ans = 0;
queue<int> q;
while(1)
{
while(!q.empty()) q.pop();
q.push(1);
memset(visit, 0, sizeof(visit));
memset(father, 0, sizeof(father));
while(!q.empty())
{
int from = q.front();
q.pop();
if(from == n)
break;
for(int to = 1 ; to <= n; to++)
{
if(flow[from][to] && !visit[to])
{
father[to] = from;
q.push(to);
visit[to] = true;
}
}
}
if(!visit[n])
return ans;
int minflow = INT_MAX;
for(int to = n; to != 1; to = father[to])
{
int from = father[to];
if(minflow > flow[from][to])
minflow = flow[from][to];
}
for(int to = n; to != 1; to = father[to])
{
int from = father[to];
flow[from][to] -= minflow;
flow[to][from] += minflow;
}
ans += minflow;
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(flow, 0, sizeof(flow));
for(int i = 0 ; i < m; i++)
{
int from, to, val;
scanf("%d%d%d",&from, &to, &val);
flow[from][to] += val;
}
printf("%d\n", ford_fulkerson());
}
}