1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <iostream> #include <algorithm> #include <cstdio> using namespace std; typedef long long ll; const int N = 300010; int n, m, rc, ru[N], rv[N]; int pu[N], pv[N], nu, nv; ll d[N], rw[N]; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); d[u] += (ll)w, d[v] -= (ll)w; } for (int i = 1; i <= n; i++) { if (d[i] > 0) pu[++nu] = i; if (d[i] < 0) pv[++nv] = i; } int p1 = 1, p2 = 1; while (p1 <= nu && p2 <= nv) { if (d[pu[p1]] > abs(d[pv[p2]])) { rw[++rc]= abs(d[pv[p2]]); d[pu[p1]] -= abs(d[pv[p2]]); ru[rc] = pu[p1], rv[rc] = pv[p2]; p2++; } else if (d[pu[p1]] < abs(d[pv[p2]])) { rw[++rc] = d[pu[p1]]; d[pv[p2]] += d[pu[p1]]; ru[rc] = pu[p1], rv[rc] = pv[p2]; p1++; } else { rw[++rc] = d[pu[p1]]; d[pu[p1]] = d[pv[p2]] = 0; ru[rc] = pu[p1], rv[rc] = pv[p2]; p1++, p2++; } } printf("%d\n", rc); for (int i = 1; i <= rc; i++) printf("%d %d %lld\n", ru[i], rv[i], rw[i]); return 0; }
|