看了半天不知道哪里错了,求大佬帮忙调调qwq
思路:Tarjan缩点+SPFA跑最长路
思路有正确性,题解中有和我一样的写法
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=8e4+5,M=2e5+5,INF=2147483647;
int head_e[N],head_t[N],dis[N],dfn[N],low[N],sum[N],belong[N],u[N],v[N],w[N];
int n,m,S,tot,num,cnt,ans;
struct node{
int dis,next,to;
}Edge_e[M],Edge_t[M];
stack<int> s;
bool vis[N];
double l[N];
inline int read()
{
int x=0;
bool w=0;
char c=getchar();
while(!isdigit(c))
w|=c=='-',c=getchar();
while(isdigit(c))
x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
inline void add_t(int u,int v)
{
Edge_t[++tot].to=v;
Edge_t[tot].next=head_t[u];
head_t[u]=tot;
}
inline void Tarjan(int u)
{
dfn[u]=low[u]=++num;
s.push(u);vis[u]=1;
for(register int i=head_e[u];i;i=Edge_e[i].next)
{
int v=Edge_e[i].to;
if(!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
int t=0;++cnt;
while(t!=u)
{
t=s.top();
s.pop();
belong[t]=cnt;
}
}
}
inline int calc(int w,double s)
{
int sum=0;
while(w)
{
sum+=w;
w*=s;
}
return sum;
}
inline void add_e(int u,int v,int w)
{
Edge_e[++tot].to=v;
Edge_e[tot].dis=w;
Edge_e[tot].next=head_e[u];
head_e[u]=tot;
}
inline void SPFA(int s)
{
queue<int> q;
for(register int i=1;i<=n;++i)
dis[i]=-INF;
dis[belong[s]]=0;
q.push(belong[s]);
while(!q.empty())
{
int u=q.front();
q.pop();vis[u]=0;
for(register int i=head_e[u];i;i=Edge_t[i].next)
{
int v=Edge_t[i].to,w=Edge_t[i].dis;
if(dis[v]<dis[u]+sum[v]+w)
{
dis[v]=dis[u]+sum[v]+w;
q.push(v);vis[v]=1;
}
}
}
}
int main()
{
n=read(),m=read();
for(register int i=1;i<=m;++i)
{
u[i]=read(),v[i]=read(),w[i]=read();
scanf("%lf",&l[i]);
add_t(u[i],v[i]);
}
tot=0;
for(register int i=1;i<=n;++i)
if(!dfn[i]) Tarjan(i);
for(register int i=1;i<=m;++i)
{
int bu=belong[u[i]],bv=belong[v[i]];
if(bu!=bv)
add_e(bu,bv,w[i]);
else sum[bv]=calc(w[i],l[i]);
}
S=read();
SPFA(S);
for(register int i=1;i<=n;++i)
ans=max(ans,dis[i]);
printf("%d",ans);
return 0;
}