题目大意:
给出N条排水沟的起点和终点及其最大排水量,点1是池塘,点M是小河,让你求出整个排水系统的最大排水量
解题思路:
这题是一道最大流的入门题,非常适合入门。
《挑战程序设计竞赛》一书中对于Ford-Fulkerson算法的讲解算是比较容易让人理解的了。
这里直接用了书上的代码作了略微修改ac了这道题,第一道网络流
代码:
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
//用于表示边的结构体
typedef struct node{
int to, cap, rev; //终点、容量、反向边
node(int a = 0, int b = 0, int c = 0){
to = a; cap = b; rev = c;
}
}edge;
const int maxn = 200 + 5;
const int INF = 0x3f3f3f3f;
vector<edge> vec[maxn]; //图的邻接表表示
bool used[maxn]; //DFS中用到的访问标记
//向图中增加一条从s到t容量为cap的边
void add_edge(int from, int to, int cap){
vec[from].push_back(edge(to, cap, vec[to].size()));
vec[to].push_back(edge(from, 0, vec[from].size()-1));
}
//通过DFS寻找增广路
int dfs(int v, int t, int f){
if(v == t) return f;
used[v] = true;
int len = vec[v].size();
for(int i = 0; i < len; ++i){
edge& e = vec[v][i];
if(!used[e.to] && e.cap > 0){
int d = dfs(e.to, t, min(f, e.cap));
if(d > 0){
e.cap -= d;
vec[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
//求解从s到t的最大流
int max_flow(int s, int t){
int flow = 0;
while(true){
memset(used, 0, sizeof(used));
int f = dfs(s, t, INF);
if(f == 0) return flow;
flow += f;
}
}
int main(){
int a, b, c, n, m;
while(~scanf("%d%d", &n, &m)){
for(int i = 0; i <= m; ++i) vec[i].clear();
for(int i = 0; i < n; ++i){
scanf("%d%d%d", &a, &b, &c);
add_edge(a, b, c);
}
printf("%d\n", max_flow(1, m));
}
return 0;
}