#include <iostream> #include <queue> #include <string.h> #define MAX 302 using namespace std; int c[MAX][MAX]; int pre[MAX]; int visited[MAX]; int n, m; bool Path(int src, int des) { queue <int> q; for (int i = 0; i <= m; i++) { visited[i] = 0; pre[i] = 0; } q.push(src); visited[src] = 1; while (!q.empty()) { int cur = q.front(); q.pop(); for (int i = 1; i <= m; i++) { if (!visited[i] && c[cur][i]) { q.push(i); pre[i] = cur; visited[i] = 1; if (i == des) { return true; break; } } } } return false; } int EK(int src, int des) { int min, i, total = 0; while (true) { if (!Path(src, des)) { break; } i = des; min = (1 << 30); while (i != src) { if (min > c[pre[i]][i]) { min = c[pre[i]][i]; } i = pre[i]; } i = des; while (i != src) { c[pre[i]][i] -= min; c[i][pre[i]] += min; i = pre[i]; } total += min; } return total; } int main() { int a, b, f; while (cin >> n >> m) { memset(c, 0, sizeof(c)); for (int i = 0; i < n; i++) { cin >> a >> b >> f; c[a][b] += f; } cout << EK(1, m) << endl; } return 0; }
网络流的EK算法,主要就是不断的找增广路,如果找到了增广路,说明流量还可以增加,否则输出最大流即可.
找增广路用到bfs,找到后必须更新残量网络,用增广路的最大流更新残量网络.