dq是点权,val是把强联通中薅秃了的值
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int N=1e6+10;
struct Node{
int from,next,to,w;
double idx;
}a[N],b[N];
int n,m,ss,tot,timestamp,cnt,tt,s[N],low[N],dfn[N],ins[N],belong[N],d[N],vis[N],dq[N],val[N],val1[N];
int head1[N],tot1,head[N];
queue<int> q;
void add(int u,int v,double w,double idx){
a[++tot].to=v;
a[tot].w=w;
a[tot].from=u;
a[tot].idx=idx;
a[tot].next=head[u];
head[u]=tot;
while((int)w){
val[tot]+=(int)w;
w=(int)(floor(w*idx));
}
}
void add1(int u,int v,double w){
b[++tot1].to=v;
b[tot1].from=u;
b[tot1].w=-w;
b[tot1].next=head1[u];
head1[u]=tot1;
}
void dfs(int u){
dfn[u]=low[u]=++timestamp;
s[++tt]=u;
ins[u]=1;
for(int i=head[u];i;i=a[i].next){
int v=a[i].to;
if(!dfn[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}else if(ins[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int y;
while(y=s[tt--]){
belong[y]=u;
ins[y]=0;
if(y==u)break;
}
}
}
void spfa(int ss){
memset(d,0x3f,sizeof(d));
d[ss]=-val[ss];
vis[ss]=1;
q.push(belong[ss]);
while(!q.empty()){
int h=q.front();
q.pop();
vis[h]=0;
for(int i=head[h];i;i=b[i].next){
int v=b[i].to;
if(d[v]>d[h]+b[i].w+dq[v]){
d[v]=d[h]+b[i].w+dq[v];
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
int maxn=-2e9;
for(int i=1;i<=n;i++){
maxn=max(maxn,-d[i]);
}
cout<<maxn<<endl;
}
signed main(){
//freopen("P2656_1.in","r",stdin);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
double idx;
cin>>u>>v>>w>>idx;
add(u,v,w,idx);
}
for(int i=1;i<=n;i++){
if(!dfn[i])dfs(i);
}
for(int i=1;i<=m;i++){
int x=belong[a[i].from],y=belong[a[i].to];
if(x==y){
dq[x]+=val[i];
}
}
for(int i=1;i<=m;i++){
int x=belong[a[i].from],y=belong[a[i].to];
if(x!=y)add1(x,y,a[i].w);
}
cin>>ss;
spfa(belong[ss]);
return 0;
}