# 危橋 ```cpp= #include <algorithm> #include <iostream> #include <cassert> #include <cstdio> #include <cstdlib> #include <cstring> #include <map> #include <cmath> #include <queue> #include <stack> #include <set> #include <string> #include <utility> #include <vector> #define MOD (1000000007) #define INF (0x3f3f3f3f) #define PREC (0.0000001) #define X first #define Y second using namespace std; typedef long long int ll; typedef pair<int, int> pii; class maxFlow{ int** cap; int *vstd; int *par; vector<int> *mp; int vs; queue<int> que; bool flag; int s, e; int ecnt = 0; public: int ans; maxFlow(){}; maxFlow(int n, int start, int end) //Numbers of node, start, end { vs = n; s = start; e = end; flag = true; vstd = new int[n + 10]; par = new int[n + 10]; mp = new vector<int>[n + 10]; cap = new int*[n + 10]; memset(vstd, 0, sizeof(int) * (n + 10)); for(int i = 0; i < n + 10; i++) { cap[i] = new int[n + 10]; memset(cap[i], 0, sizeof(int) * (n + 10)); } } void addEdge(int from, int to, int cp) { mp[from].push_back(to); mp[to].push_back(from); cap[from][to] += cp; } int exe() { int count = 1; int temp; int mn; flag = true; ans = 0; while(flag) { flag = false; ecnt++; que.push(s); vstd[s] = count; par[s] = -1; while(!que.empty()) { temp = que.front(); que.pop(); if(flag) continue; if(temp == e) { flag = true; mn = INF; while(par[temp] != -1) { if(cap[par[temp]][temp] < mn) mn = cap[par[temp]][temp]; temp = par[temp]; } ans += mn; temp = e; while(par[temp] != -1) { cap[par[temp]][temp] -= mn; cap[temp][par[temp]] += mn; temp = par[temp]; } continue; } for(int v : mp[temp]) { if(vstd[v] != count && cap[temp][v] > 0) { vstd[v] = count; que.push(v); par[v] = temp; } } } count++; } fprintf(stderr, "choose : %d\n", ecnt); return ans; } }; void init() { } void solve() { int v, e; scanf("%d %d", &v, &e); maxFlow mxf(v, 1, v); int from, to, w; for(int i = 0; i < e; i++) { scanf("%d %d %d", &from, &to, &w); if(w < 0) { mxf.addEdge(from, to, -w); } } printf("%d\n", mxf.exe()); } int main() { // int n; // scanf("%d", &n); // while(n--) { init(); solve(); } return 0; } ```