rt
#include<bits/stdc++.h>
using namespace std;
#define N 80005
struct node{
int v,w,W;
};
struct edge{
int v,w;
};
vector<node> g[N];
vector<edge> G[N];
int n,m,s;
int dfn[N],low[N],buc[N],sum[N],scc[N],num,cnt,dp[N];
stack<int> stk;
void Tarjan(int u){
dfn[u]=low[u]=++cnt;
buc[u]=1;
stk.push(u);
for(auto ed:g[u]){
int v=ed.v,w=ed.W;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(buc[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
num++;
int y;
do{
y=stk.top();
stk.pop();
scc[y]=num;
buc[y]=0;
}while(y!=u);
}
}
int dis[N];
bool vis[N];
void SPFA(){
int ans=0;
queue<int> q;
s=scc[s];
q.push(s);
dis[s]=sum[s];
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(auto ed:G[u]){
int v=ed.v,w=ed.w;
if(dis[v]<dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
for(int i=1;i<=num;i++) ans=max(ans,dis[i]);
cout<<ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w,tmp,W;
double h;
cin>>u>>v>>w>>h;
tmp=W=w;
h*=10;
while(tmp){
tmp=tmp*h/10;
W+=tmp;
}
g[u].push_back({v,w,W});
}
for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
for(int u=1;u<=num;u++)
for(auto ed:g[u]){
int v=ed.v;
if(scc[u]==scc[v]) sum[scc[u]]+=ed.W;
else G[scc[u]].push_back({scc[v],ed.w});
}
cin>>s;
SPFA();
return 0;
}
为什么后两个数据点过了,前面没过