#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
inline int read(){
int x = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
int n, m, u, v, w, low[1000005], dfn[1000005], vis[1000005], tim, belong[1000005], sum[1000005], cnt, b[1000005], in[1000005], dp[1000005], S[1000005], st;
vector< pair<int, int> > d[1000005], d1[1000005];
stack<int> s;
void tarjan(int x){
dfn[x] = low[x] = ++tim;
vis[x] = 1; s.push(x);
for(int i = 0; i < d[x].size(); ++i){
int y = d[x][i].first;
if(!dfn[y]){
tarjan(y);
low[x] = min(low[x], low[y]);
}
else if(vis[y]) low[x] = min(low[x], dfn[y]);
}
if(dfn[x] == low[x]){
int y; ++cnt;
do{
y = s.top();
s.pop();
belong[y] = cnt;
vis[y] = 0;
}while(x != y);
}
}
void toposort(){
queue<int> q;
st = belong[st];
dp[st] = sum[st];
q.push(st);
while(q.size()){
int x = q.front(); q.pop();
for(int i = 0; i < d1[x].size(); ++i){
int y = d1[x][i].first;
dp[y] = max(dp[y], dp[x] + sum[y] + d1[x][i].second);
if(--in[y] == 0) q.push(y);
}
}
int ans = 0;
for(int i = 1; i <= cnt; ++i) ans = max(ans, dp[i]);
printf("%lld\n", ans);
}
signed main(){
for(int i = 1; i <= 50000; ++i) b[i] = b[i - 1] + i, S[i] = S[i - 1] + b[i];
n = read(), m = read();
for(int i = 1; i <= m; ++i){
u = read(), v = read(), w = read();
d[u].push_back(make_pair(v, w));
}
st = read();
for(int i = 1; i <= n; ++i) if(!dfn[i]) tarjan(i);
for(int i = 1; i <= n; ++i){
for(int j = 0; j < d[i].size(); ++j){
int y = d[i][j].first;
w = d[i][j].second;
if(belong[i] == belong[y]){
// printf("%d %d kk\n", lower_bound(b + 1, b + 1 + 50005, w) - b, S[lower_bound(b + 1, b + 1 + 50005, w) - b - 1]);
sum[belong[i]] += d[i][j].second * (lower_bound(b + 1, b + 1 + 50005, w) - b) - S[lower_bound(b + 1, b + 1 + 50005, w) - b - 1];
// printf("%d %d\n", belong[i], sum[belong[i]]);
}
else{
d1[belong[i]].push_back(make_pair(belong[y], d[i][j].second));
in[belong[y]]++;
}
}
}
toposort();
return 0;
}
思路没有问题,求大佬看看细节实现哪里有错/kel/bx