这是我的 AC 代码,注意到中间的那个原点我标注了 bullshit,你 Ctrl+F 一下就发现根本没用到这个玩意儿,是因为数据水吗?
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cerr<<#x<<' '<<x<<endl
/* --------------- fast io --------------- */ // begin
namespace Fread{
const int SIZE= 1 << 16;
char buf[SIZE],*S,*T;
inline char getchar(){if(S==T){T=(S=buf)+
fread(buf,1,SIZE,stdin);if(S==T)return'\n';}return *S++;}
} // namespace Fread
namespace Fwrite {
const int SIZE= 1 << 16;
char buf[SIZE],*S=buf,*T=buf+SIZE;
inline void flush(){fwrite(buf,1,S-buf,stdout);S=buf;}
inline void putchar(char c){*S++=c;if(S==T)flush();}
struct NTR{~NTR(){flush();}}ztr;
} // namespace Fwrite
#ifdef ONLINE_JUDGE
#define getchar Fread::getchar
#define putchar Fwrite::putchar
#endif
namespace Fastio{
struct Reader{
template<typename T>Reader&operator>>(T&x){
char c=getchar();short f=1;
while(c<'0'||c>'9'){if(c=='-')f*=-1;c=getchar();}
x=0;while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}x*=f;return *this;
}
Reader&operator>>(double&x){
char c=getchar();short f=1,s=0;x=0;double t=0;
while((c<'0'||c>'9')&&c!='-'&&c!='.'){if(c=='-')f*=-1;c=getchar();}
while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();
if(c=='.')c=getchar();else return x*=f,*this;
while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();
while(s--)t/=10.0;x=(x+t)*f;return*this;
}
Reader&operator>>(long double&x){
char c=getchar();short f=1,s=0;x=0;long double t=0;
while((c<'0'||c>'9')&&c!='-'&&c!='.'){if(c=='-')f*=-1;c=getchar();}
while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();
if(c=='.')c=getchar();else return x*=f,*this;
while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();
while(s--)t/=10.0;x=(x+t)*f;return*this;
}
Reader&operator>>(__float128&x){
char c=getchar();short f=1,s=0;x=0;__float128 t=0;
while((c<'0'||c>'9')&&c!='-'&&c!='.'){if(c=='-')f*=-1;c=getchar();}
while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();
if(c=='.')c=getchar();else return x*=f,*this;
while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();
while(s--)t/=10.0;x=(x+t)*f;return*this;
}
Reader&operator>>(char&c){
c=getchar();while(c=='\n'||c==' ')c=getchar();
return *this;
}
Reader&operator>>(char*str){
int len=0;char c=getchar();
while(c=='\n'||c==' ')c=getchar();
while(c!='\n'&&c!=' ')str[len++]=c,c=getchar();
str[len]='\0';return*this;
}
Reader&operator>>(string&str){
int len=0;char c=getchar();
while(c=='\n'||c==' ')c=getchar();
while(c!='\n'&&c!=' ')str.push_back(c),c=getchar();
return*this;
}
Reader(){}
}cin;
const char endl='\n';
struct Writer{
const int Setprecision=6;
typedef int mxdouble;
template<typename T>Writer&operator<<(T x){
if(x==0)return putchar('0'),*this;
if(x<0)putchar('-'),x=-x;
static int sta[45];int top=0;
while(x)sta[++top]=x%10,x/=10;
while(top)putchar(sta[top]+'0'),--top;
return*this;
}
Writer&operator<<(double x){
if(x<0)putchar('-'),x=-x;
mxdouble _=x;x-=(double)_;static int sta[45];int top=0;
while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');
while(top)putchar(sta[top]+'0'),--top;putchar('.');
for(int i=0;i<Setprecision;i++)x*=10;
_=x;while(_)sta[++top]=_%10,_/=10;
for(int i=0;i<Setprecision-top;i++)putchar('0');
while(top)putchar(sta[top]+'0'),--top;
return*this;
}
Writer&operator<<(long double x){
if(x<0)putchar('-'),x=-x;
mxdouble _=x;x-=(long double)_;static int sta[45];int top=0;
while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');
while(top)putchar(sta[top]+'0'),--top;putchar('.');
for(int i=0;i<Setprecision;i++)x*=10;
_=x;while(_)sta[++top]=_%10,_/=10;
for(int i=0;i<Setprecision-top;i++)putchar('0');
while(top)putchar(sta[top]+'0'),--top;
return*this;
}
Writer&operator<<(__float128 x){
if(x<0)putchar('-'),x=-x;
mxdouble _=x;x-=(__float128)_;static int sta[45];int top=0;
while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');
while(top)putchar(sta[top]+'0'),--top;putchar('.');
for(int i=0;i<Setprecision;i++)x*=10;
_=x;while(_)sta[++top]=_%10,_/=10;
for(int i=0;i<Setprecision-top;i++)putchar('0');
while(top)putchar(sta[top]+'0'),--top;
return*this;
}
Writer&operator<<(char c){putchar(c);return*this;}
Writer& operator<<(char*str){
int cur=0;while(str[cur])putchar(str[cur++]);
return *this;
}
Writer&operator<<(const char*str){
int cur=0;while(str[cur])putchar(str[cur++]);
return*this;
}
Writer&operator<<(string str){
int st=0,ed=str.size();
while(st<ed)putchar(str[st++]);
return*this;
}
Writer(){}
}cout;
} // namespace Fastio
#define cin Fastio :: cin
#define cout Fastio :: cout
#define endl Fastio :: endl
/* --------------- fast io --------------- */ // end
#define maxn 200010
int n,m,bullshit;
int x[maxn],y[maxn],z[maxn],w[maxn];
double _;
int head[maxn],Next[maxn],ver[maxn],edge[maxn],tot;
int col,cc[maxn];
void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z;
Next[tot]=head[x],head[x]=tot;
}
int dfn[maxn],low[maxn],cnt;
bitset<maxn>ins;
int sta[maxn],top;
void tarjan(int x){
dfn[x]=low[x]=++cnt;
ins[x]=1;
sta[++top]=x;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);
else if(ins[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
int y;col++;
while(y=sta[top--]){
ins[y]=0;
cc[y]=col;
if(x==y)break;
}
}
}
int q[10000000],l,r;
int G[maxn];
int in[maxn];
int work(int d,int f){
int ans=0;
while(d)ans+=d,d=d*f/10;
return ans;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("testdata.in","r",stdin);
#endif
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>x[i]>>y[i]>>z[i]>>_,w[i]=_*10,add(x[i],y[i],z[i]);
cin>>bullshit;
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
tot=0;memset(head,0,sizeof head);
for(int i=1;i<=m;i++){
if(cc[x[i]]==cc[y[i]])G[cc[x[i]]]+=work(z[i],w[i]);
else add(cc[x[i]],cc[y[i]],z[i]),in[cc[y[i]]]++;
}
l=1,r=0;
for(int i=1;i<=col;i++)if(!in[i])q[++r]=i;
while(l<=r){
int x=q[l++];
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
G[y]=max(G[x]+edge[i],G[y]);
if(--in[y]==0)q[++r]=y;
}
}
int ans=0;
for(int i=1;i<=col;i++)ans=max(ans,G[i]);
cout<<ans;
#ifndef ONLINE_JUDGE
cerr<<endl<<(double)clock()/CLOCKS_PER_SEC;
#endif
}