神**精度问题
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m,l;
struct sm
{
int u,v,w;
int next;
double f;
}a[maxn*20],a1[maxn*20];
int head[maxn],cnt;
void add(int u,int v,int w,double f)
{
a[++cnt].u=u;
a[cnt].v=v;
a[cnt].w=w;
a[cnt].f=f;
a[cnt].next=head[u];
head[u]=cnt;
}
int head1[maxn],cnt1;
void add1(int u,int v,int w)
{
a1[++cnt1].u=u;
a1[cnt1].v=v;
a1[cnt1].w=w;
a1[cnt1].next=head1[u];
head1[u]=cnt1;
}
int dfn[maxn],low[maxn],bottle[maxn],color[maxn],tot,kind;
bool vis[maxn];
stack<int>s;
void tarjan(int u)
{
low[u]=dfn[u]=++tot;
s.push(u);
vis[u]=true;
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
int x;
if(dfn[u]==low[u])
{
kind++;
do
{
x=s.top();
color[x]=kind;
vis[x]=false;
s.pop();
}while(u!=x);
}
}
int dis[maxn];
bool pl[maxn];
void spfa()
{
queue<int>q;
memset(dis,-0x3f3f3f,sizeof(dis));
dis[color[l]]=bottle[color[l]];
pl[color[l]]=true;
q.push(color[l]);
while(!q.empty())
{
int u=q.front();
pl[u]=false;
q.pop();
for(int i=head1[u];i;i=a1[i].next)
{
int w=a1[i].w;
int v=a1[i].v;
if(dis[u]+w>dis[v])
{
dis[v]=dis[u]+w;
if(pl[v])continue;
pl[v]=true;
q.push(v);
}
}
}
int ans=-1;
for(int i=1;i<=kind;i++)ans=max(ans,dis[i]);
//ans+=bottle[color[l]];
printf("%d",ans);
}
int main()
{
/*freopen("ll.in","r",stdin);
freopen("ll.out","w",stdout);*/
scanf("%d%d",&n,&m);
int x,y,z;
double k;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%lf",&x,&y,&z,&k);
add(x,y,z,k);
}
scanf("%d",&l);
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int u=1;u<=n;u++)
{
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].v;
if(color[u]==color[v])
{
int num=a[i].w;
double res=a[i].f;
while(num!=0)
{
a[i].w=a[i].w+(int)num*res;
num=(int)num*a[i].f;
}
bottle[color[u]]+=a[i].w;
}
}
}
for(int u=1;u<=n;u++)
{
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].v;
int w=a[i].w;
if(color[u]!=color[v])add1(color[u],color[v],bottle[color[v]]+w);
}
}
spfa();
}