5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
50
算法经典
将题目意思看懂这道题目便可以解决了
#include <map> #include <set> #include <cmath> #include <ctime> #include <queue> #include <vector> #include <cctype> #include <cstdio> #include <string> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #include <functional> using namespace std; #define pb push_back #define mp make_pair #define fillchar(a, x) memset(a, x, sizeof(a)) #define copy(a, b) memcpy(a, b, sizeof(a)) #define lson rt << 1, l, mid #define rson rt << 1|1, mid + 1, r typedef long long LL; typedef pair<int, int > PII; typedef unsigned long long uLL; template<typename T> void print(T* p, T* q, string Gap = " ") { int d = p < q ? 1 : -1; while(p != q) { cout << *p; p += d; if(p != q) cout << Gap; } cout << endl; } template<typename T> void print(const T &a, string bes = "") { int len = bes.length(); if(len >= 2)cout << bes[0] << a << bes[1] << endl; else cout << a << endl; } const int INF = 0x3f3f3f3f; const int MAXM = 2e5; const int MAXN = 200 + 5; int N, M; struct edge { int to, cap, rev; }; vector<edge> G[MAXN]; bool vis[MAXN]; void add_edge(int from, int to,int cap) { G[from].push_back((edge) { to, cap, G[to].size() }); G[to].push_back((edge) { from, 0, G[from].size() - 1 }); } int DFS(int v, int t, int f) { if(v == t) return f; vis[v] = true; for(int i = 0; i < G[v].size(); i ++) { edge &e = G[v][i]; if(!vis[e.to] && e.cap > 0) { int d = DFS(e.to, t, min(f, e.cap)); if(d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } LL max_flow(int s, int t) { LL flow = 0; for(;;) { memset(vis, false, sizeof(vis)); int f = DFS(s, t, INF); if(f == 0) return flow; flow += f; } } int main() { int s, e, c; while(~scanf("%d%d", &N, &M)) { for(int i = 0;i <= M;i ++) G[i].clear(); for(int i = 0;i < N;i ++){ scanf("%d%d%d", &s, &e, &c); add_edge(s, e, c); } printf("%lld\n", max_flow(1, M)); } return 0; }