代码求调
查看原帖
代码求调
199459
Masna_Kimoyo楼主2021/6/12 09:58

看了半天不知道哪里错了,求大佬帮忙调调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;
}
2021/6/12 09:58
加载中...