#include<iostream> #include<vector> #include<cstring> #include<algorithm> #include<map> #include<utility> usingnamespacestd; typedeflonglong ll; typedef pair<int, int> P; int V; constint maxv= 1000010; vector<int> G[maxv], rG[maxv], vs; bool used[maxv]; int cmp[maxv]; voidadd_edge(int from, int to){ G[from].push_back(to); rG[to].push_back(from); } voiddfs(int v){ used[v] = true; for(int i = 0; i < G[v].size(); i++){ if (!used[G[v][i]]) dfs(G[v][i]); } vs.push_back(v); }
voidrdfs(int v, int k){ used[v] = true; cmp[v] = k; for (int i = 0; i < rG[v].size(); i++){ if (!used[rG[v][i]]) rdfs(rG[v][i], k); } }
intscc(){ memset(used, 0, sizeof(used)); vs.clear(); for (int v = 1; v <= V; v++){ if (!used[v]) dfs(v); } memset(used, 0 , sizeof(used)); int k = 0; for (int i = vs.size() - 1; i >= 0; i--){ if(!used[vs[i]]) rdfs(vs[i], k++); } return k; }
constint sn = 22000; ll sum[sn], accSum[sn];
voidinit_sum(){ sum[0] = accSum[sn] = 0; for (int i = 1; i < sn; i++) sum[i] = sum[i - 1] + i; for (int i = 1; i < sn; i++) accSum[i] = accSum[i - 1] + sum[i]; }
ll calWeight(int x){ int k = upper_bound(sum, sum + sn, x) - sum - 1; return (ll)(k+1) * x - accSum[k]; }
ll shrink_vertex_weight[maxv], dp[maxv]; int sV; vector<int> shrink_graph[maxv]; map<P, ll> shrink_edge_weight; structedge{int from, to, weight;}; edge edges[maxv];
intmain(){ ios::sync_with_stdio(false); cin.tie(0); init_sum(); int n, m; cin >> n >> m; V = n; for (int i = 0; i < m; i++) { int from, to, weight; cin >> from >> to >> weight; add_edge(from, to); edges[i] = edge{from, to, weight}; } int start; cin >> start; sV = scc(); for (int i = 0; i < m; i++) { int v1 = edges[i].from, v2 = edges[i].to; if (cmp[v1] == cmp[v2]) { shrink_vertex_weight[cmp[v1]] += calWeight(edges[i].weight); } else { update(shrink_edge_weight[P(cmp[v1], cmp[v2])], edges[i].weight); shrink_graph[cmp[v1]].push_back(cmp[v2]); } } memset(dp, -1, sizeof(dp)); cout << f(cmp[start]) << endl; }