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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #include<bits/stdc++.h> using namespace std; using ll = long long; constexpr int N = 100 + 5, inf = 0x3f3f3f3f; struct mss { int fa[N << 1]; mss() :fa() {} int& operator()(int x) { return fa[x]; } int operator[](int x) { return fa[x] ? fa[x] = (*this)[fa[x]] : x; } }id; struct Edge { int u, v, w, val; }; struct Node { Edge* data; int dist, add; Node* ls, * rs; Node(Edge* data) : data(data), dist(1), add(), ls(), rs() {} void pushdown() { if (ls) ls->add += add; if (rs) rs->add += add; data->w += add; add = 0; } }; Node* merge(Node* x, Node* y) { if (!x) return y; if (!y) return x; if (x->data->w + x->add > y->data->w + y->add) swap(x, y); x->pushdown(); x->rs = merge(x->rs, y); if (!x->ls || x->ls->dist < x->rs->dist) swap(x->ls, x->rs); if (x->rs) x->dist = x->rs->dist + 1; else x->dist = 1; return x; } Edge* top(Node*& x) { Edge* r = x->data; x->pushdown(); x = merge(x->ls, x->rs); return r; } vector<Edge> in[N]; int n, m, fa[N << 1], nxt[N << 1]; Edge* cyc[N << 1]; Node* pq[N << 1]; bool vis[N << 1]; ll expand(int x, int t) { ll r = 0; for (; x != t; x = fa[x]) { ll sum = 0; for (int u = nxt[x]; u != x; u = nxt[u]) { if (cyc[u]->val >= inf) return inf; ll child = expand(cyc[u]->v, u); if (child >= inf || sum >= inf) { sum = inf; break; } sum += child + cyc[u]->val; } if (sum >= inf || (r += sum) >= inf) return inf; } return r; } int main() { int rt; cin >> n >> m >> rt; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; in[v].push_back({ u, v, w, w }); } for (int i = 1; i <= n; i++) in[i].push_back({ i > 1 ? i - 1 : n, i, inf, inf }); for (int i = 1; i <= n; i++) { queue<Node*> q; for (Edge& e : in[i]) q.push(new Node(&e)); while (q.size() > 1) { Node* u = q.front(); q.pop(); Node* v = q.front(); q.pop(); q.push(merge(u, v)); } pq[i] = q.front(); } vis[1] = true; for (int a = 1, b = 1; pq[a]; b = a, vis[b] = true) { do { cyc[a] = top(pq[a]); a = id[cyc[a]->u]; } while (a == b && pq[a]); if (a == b) break; if (!vis[a]) continue; a = b; n++; while (a != n) { id(a) = fa[a] = n; if (pq[a]) pq[a]->add -= cyc[a]->w; pq[n] = merge(pq[n], pq[a]); int p = id[cyc[a]->u]; nxt[p == n ? b : p] = a; a = p; } } ll ans = expand(rt, n); cout << (ans >= inf ? -1 : ans) << endl; return 0; }
|