题目大意:
给出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 ", max_flow(1, m)); } return 0; }