1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<bits/stdc++.h> #define LD double using namespace std; inline int read(){ int res=0,f=1;char ch=getchar(); while(ch<'0'ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar(); return res*f; } struct edge{int u,v,w;}e[200010]; int n,m,fir[80010],nxt[200010],son[200010],w[200010],tot,sum[200010],val[200010],S,dis[80010],vis[80010],d[80010],t; vector<int> G[80010],P[80010]; inline void add(int x,int y,int z){++tot;nxt[tot]=fir[x];fir[x]=tot;son[tot]=y;w[tot]=z;} inline void dfs1(int x){ vis[x]=1; for(auto i:G[x]) if(!vis[i]) dfs1(i); d[++t]=x; } inline void dfs2(int x){ vis[x]=t; for(auto i:P[x]) if(!vis[i]) dfs2(i); } inline void kosaraju(){ memset(vis,0,sizeof(vis));t=0; for(int i=1;i<=n;i++) if(!vis[i]) dfs1(i); memset(vis,0,sizeof(vis));t=0; for(int i=n;i>=1;i--) if(!vis[d[i]]) ++t,dfs2(d[i]); } inline void dfs(int x){ if(dis[x]) return ; dis[x]=val[x]; int Max=0; for(int to,i=fir[x];i;i=nxt[i]){ to=son[i]; dfs(to); Max=max(Max,dis[to]+w[i]); } dis[x]+=Max; } int main(){ n=read();m=read(); for(int x,y,w,i=1;i<=m;i++){ x=read();y=read();w=read(); e[i]=(edge){x,y,w}; G[x].push_back(y); P[y].push_back(x); LD s;scanf("%lf",&s); while(w){ sum[i]+=w; w=(LD)w*s; } } kosaraju(); for(int i=1;i<=m;i++) if(vis[e[i].u]!=vis[e[i].v]) add(vis[e[i].u],vis[e[i].v],e[i].w); else val[vis[e[i].u]]+=sum[i]; S=read(); dfs(vis[S]); printf("%d\n",dis[vis[S]]); }
|