求调o(╥﹏╥)oP2656 采蘑菇
30pts 数据小了 (つД`)・゚・
#include<bits/stdc++.h>
using namespace std;
int n,m,kk=0,ss,maxx=0,qq=0,miao[80050],v[80500],b[80500],aa[80500],vv[80500],v2[80500],dfn[80500],low[80500],c[80500],vt[80050],jj=0,gg;
struct pt{
int u;
int mg;
double kk;
};
vector<pt>g[80050];
vector<pt>p[80050];
stack<int>s;
queue<int>q;
void spfa(int sz){
memset(vv,-1,sizeof(vv));
vv[sz]=vt[c[sz]];
aa[sz]=1;
q.push(sz);
while(q.size()){
int z=q.front();
q.pop();
aa[z]=0;
for(int i=0;i<p[z].size();i++){
if(vv[p[z][i].u]<=vv[z]+p[z][i].mg+vt[p[z][i].u]){
vv[p[z][i].u]=vv[z]+p[z][i].mg+vt[p[z][i].u];
if(!aa[p[z][i].u]){
aa[p[z][i].u]=1;
q.push(p[z][i].u);
}
}
}
}
}
void tarjan(int z){
dfn[z]=low[z]=++jj;
s.push(z);
b[z]=1;
for(int i=0;i<g[z].size();i++){
if(dfn[g[z][i].u]==0){
tarjan(g[z][i].u);
low[z]=min(low[z],low[g[z][i].u]);
}
else if(b[g[z][i].u]==1){
low[z]=min(low[z],low[g[z][i].u]);
}
}
int a;
if(dfn[z]==low[z]){//qq++;
while(1){
a=s.top();
//cout<<qq<<' '<<a<<endl;
s.pop();
b[a]=0;
c[a]=z;
if(a==z){
break;
}
//cout<<v[z]<<' '<<v[a]<<' '<<a<<endl;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,vz,vj;
double k;
cin>>x>>y>>vz>>k;
g[x].push_back({y,vz,k*10});
}
cin>>ss;
for(int i=1;i<=n;i++){
if(dfn[i]==0){
tarjan(i);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<g[i].size();j++){
//cout<<c[i]<<' '<<c[g[i][j].u]<<endl;
if(c[i]!=c[g[i][j].u]){
//cout<<c[i]<<' '<<c[g[i][j].u]<<endl;
p[c[i]].push_back({c[g[i][j].u],g[i][j].mg,g[i][j].kk});
}
else{
int z=g[i][j].mg;
while(z){
vt[c[i]]+=z;
z=z*g[i][j].kk/10;
}
}
}
}
spfa(ss);
for(int i=1;i<=n;i++){
maxx=max(maxx,vv[i]);
//cout<<vv[i]<<endl;
}
cout<<maxx;
return 0;
}