#include<bits/stdc++.h>
using namespace std;
const int maxn=80010;
const int maxm=200010;
struct ee{
int to;
int next;
int val;
int hf;
};
int head[maxn],cnt;
ee bb[maxm*2];
void jb(int q,int z,int v,int h)
{
bb[++cnt].to=z;
bb[cnt].val=v;
bb[cnt].hf=h;
bb[cnt].next=head[q];
head[q]=cnt;
}
int head2[maxn],a[maxn];
void jb2(int q,int z,int v)
{
bb[++cnt].to=z;
bb[cnt].val=v;
bb[cnt].next=head2[q];
head2[q]=cnt;
}
int dfn[maxn],low[maxn],vis[maxn];
int dnt,fa[maxn];
stack<int> dl;
void tj(int x)
{
dfn[x]=low[x]=++dnt;
vis[x]=1;dl.push(x);
for(int i=head[x];i;i=bb[i].next)
{
int sx=bb[i].to;
if(!dfn[sx])
{
tj(sx);
low[x]=min(low[x],low[sx]);
}
else if(vis[sx]) low[x]=min(low[x],dfn[sx]);
}
if(low[x]==dfn[x])
{
vis[x]=0;fa[x]=x;
while(dl.top()!=x)
{
int sx=dl.top();dl.pop();
vis[sx]=0;
fa[sx]=x;
}
dl.pop();
}
}
int js(int v,int h)
{
int ans=v;
while(v)
{
v=v*h/10;
ans+=v;
}
return ans;
}
int rd[maxn],dp[maxn];
void dfs(int x)
{
for(int i=head2[x];i;i=bb[i].next)
{
int sx=bb[i].to;
rd[sx]++;
dfs(sx);
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,val,hf;
double hh;
scanf("%d%d%d%lf",&x,&y,&val,&hh);
hf=(int)(hh*10);
jb(x,y,val,hf);
}
int s;
scanf("%d",&s);
for(int i=1;i<=n;i++)//缩点
if(!dfn[i]) tj(i);
for(int x=1;x<=n;x++)//重建图
{
for(int i=head[x];i;i=bb[i].next)
{
int sx=bb[i].to;
if(fa[x]==fa[sx])
a[fa[x]]+=js(bb[i].val,bb[i].hf);
else
jb2(fa[x],fa[sx],bb[i].val);
}
}
dfs(fa[s]);
queue<int> dl;
dl.push(fa[s]);
int ans=0;
while(!dl.empty())//跑图
{
int x=dl.front();dl.pop();
ans=max(dp[x]+a[x],ans);
for(int i=head2[x];i;i=bb[i].next)
{
int sx=bb[i].to;
dp[sx]=max(dp[sx],a[x]+dp[x]+bb[i].val);
rd[sx]--;
//printf("%d:%d\n",sx,rd[sx]);
if(rd[sx]==0)
dl.push(sx);
}
}
printf("%d\n",ans);
return 0;
}
看测评与答案很接近,但布吉岛是什么问题