RT
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5,MAXM=2e6+5;
ll n,m;
ll x,y,z,s;
struct edge{
ll u,v,w,nxt;
}e[MAXM],dag[MAXM];
ll edge_num,head[MAXN];
void add_edge(ll From,ll To,ll Len){
edge_num++;
e[edge_num].u=From;
e[edge_num].v=To;
e[edge_num].w=Len;
e[edge_num].nxt=head[From];
head[From]=edge_num;
return;
}
ll dag_sz,dag_head[MAXN];
void make_dag(ll From,ll To,ll Len){
dag_sz++;
dag[dag_sz].u=From;
dag[dag_sz].v=To;
dag[dag_sz].w=Len;
dag[dag_sz].nxt=dag_head[From];
dag_head[From]=dag_sz;
return;
}
ll dfn[MAXN],low[MAXN],cnt,gcc[MAXN],st[MAXN],top;
bool in_st[MAXN];
void tarjan(ll now){
dfn[now]=low[now]=++cnt;
in_st[now]=1,st[++top]=now;
for(int i=head[now];i;i=e[i].nxt){
if(!dfn[e[i].v]){
tarjan(e[i].v);
low[now]=min(low[now],low[e[i].v]);
}
else if(in_st[e[i].v])low[now]=min(low[now],dfn[e[i].v]);
}
if(dfn[now]==low[now])while(1){
gcc[st[top]]=now;
in_st[st[top]]=0;
if(st[top]==now){
top--;
break;
}
top--;
}
return;
}
ll sc[MAXN];
ll HS(ll num){
ll qwq=floor((-1.00+sqrt(1.00+8.00*num))*0.500);
if(qwq*(qwq+1)/2>=num)qwq--;
return (qwq+1)*num-qwq*(qwq+1)*(qwq+2)/6;
}
ll ans=0;
void solve(ll now,ll now_score){
ans=max(ans,now_score);
for(int i=dag_head[now];i;i=dag[i].nxt)solve(dag[i].v,now_score+dag[i].w+sc[dag[i].v]);
return;
}
ll read(){
ll qwq=0;bool fl=1;char ch=getchar();
while(!(ch>='0'&&ch<='9')){
if(ch=='-')fl^=1;
ch=getchar();
}
while(ch>='0'&&ch<='9')qwq=(qwq<<1)+(qwq<<3)+(ch-'0'),ch=getchar();
return fl?qwq:-qwq;
}
int main(){
ios::sync_with_stdio(0);
n=read(),m=read();
for(int i=1;i<=m;i++){
x=read(),y=read(),z=read();
add_edge(x,y,z);
}
s=read();
tarjan(s);
// cout<<HS(10)<<" HS"<<endl;
for(int i=1;i<=m;i++){
if(gcc[e[i].u]==gcc[e[i].v])sc[gcc[e[i].u]]+=HS(e[i].w);
else make_dag(gcc[e[i].u],gcc[e[i].v],e[i].w);
}
solve(s,sc[gcc[s]]);
cout<<ans;
// for(int i=1;i<=n;i++)cout<<sc[i]<<" ";
return 0;
}
哪里写挂了/kk