描述
每当农场约翰的田地下雨时,一个池塘形成了贝西最喜欢的三叶草补丁。这意味着三叶草被水覆盖了一段时间并且需要相当长的时间才能再生。因此,Farmer John建造了一套排水沟,以便Bessie的三叶草补丁永远不会被水覆盖。相反,水被排放到附近的溪流中。作为一名王牌工程师,Farmer John还在每个沟渠的开始安装了调节器,因此他可以控制水流入该沟渠的速度。
农民约翰不仅知道每个沟渠每分钟可以运输多少加仑的水,而且还知道沟渠的确切布局,这些沟渠从池塘中流出并相互进入并在潜在的复杂网络中流动。
根据所有这些信息,确定水可以从池塘输送到水流中的最大速率。对于任何给定的沟渠,水只在一个方向流动,但可能有一种方式,水可以循环流动。
输入
输入包括几种情况。对于每种情况,第一行包含两个空格分隔的整数,N(0 <= N <= 200)和M(2 <= M <= 200)。 N是Farmer John挖的沟渠数量。 M是那些沟渠的交叉点数。交叉口1是池塘。交点M是流。以下N行中的每一行包含三个整数,Si,Ei和Ci。 Si和Ei(1 <= Si,Ei <= M)表示该沟流动的交叉点。水将从Si流到Ei。 Ci(0 <= Ci <= 10,000,000)是水流过沟渠的最大速率。
产量
对于每种情况,输出一个整数,即水可能从池塘中排空的最大速率。
样本输入
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
样本输出
50
#include "pch.h"
#include <iostream>
#include<iomanip>
#define N_MAX 205
#define INF (0x3f3f3f3f)
using namespace std;
int N, M; //N个路径,M个节点
int capacity[N_MAX][N_MAX]; //容量网络
int flow[N_MAX]; //流量网络,标识从源点出发到达每一点的最大流量
int pre[N_MAX]; //前一节点
queue<int>room;
//广度优先搜索寻找增广路径
int BFS(int s, int e)
{
while (!room.empty())
room.pop();
memset(flow, 0, sizeof(flow));
memset(pre, -1, sizeof(pre));
flow[s] = INF;
pre[s] = s;
room.push(s);
while (!room.empty())
{
int front = room.front();
room.pop();
if (front == e) //BFS找到终点,退出
break;
for (int i = 1; i <= M; ++i)
{
//cout << front << ' '<< capacity[front][i] <<endl;
if (pre[i] == -1 && capacity[front][i] > 0)
{
flow[i] = min(capacity[front][i], flow[front]);
pre[i] = front;
//cout << "i = " << i << " flow= " << flow[i] << endl;
room.push(i);
}
}
}
//cout << pre[e] << ' ' << flow[e] << endl;
if (pre[e] == -1) //代表没有增广路径
return -1;
else
return flow[e];
}
//Edmond—Karp算法求解网络最大流
int Max_Flow(int s,int e)
{
int Flow_Max = 0, Flow_One;
while ((Flow_One = BFS(s, e)) != -1)
{
int back = e;
while (back != s)
{
int front = pre[back];
capacity[front][back] -= Flow_One;
capacity[back][front] += Flow_One; //反向网络
back = front;
}
Flow_Max += Flow_One;
}
return Flow_Max;
}
int main()
{
while (scanf_s("%d%d", &N, &M) != EOF)
{
memset(capacity, 0, sizeof(capacity));
//memset(flow, 0, sizeof(flow));
for (int i = 0; i < N; ++i)
{
int s, e, c;
cin >> s >> e >> c;
capacity[s][e] += c;
}
cout << Max_Flow(1, M);
}
return 0;
}