成功加入60分俱乐部
  • 板块P2656 采蘑菇
  • 楼主Euclid
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/9 15:53
  • 上次更新2023/11/4 15:13:09
查看原帖
成功加入60分俱乐部
152980
Euclid楼主2021/7/9 15:53

神**精度问题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m,l;
struct sm
{
	int u,v,w;
	int next;
	double f;
}a[maxn*20],a1[maxn*20];
int head[maxn],cnt;
void add(int u,int v,int w,double f)
{
	a[++cnt].u=u;
	a[cnt].v=v;
	a[cnt].w=w;
	a[cnt].f=f;
	a[cnt].next=head[u];
	head[u]=cnt;
}
int head1[maxn],cnt1;
void add1(int u,int v,int w)
{
	a1[++cnt1].u=u;
	a1[cnt1].v=v;
	a1[cnt1].w=w;
	a1[cnt1].next=head1[u];
	head1[u]=cnt1;
}
int dfn[maxn],low[maxn],bottle[maxn],color[maxn],tot,kind;
bool vis[maxn];
stack<int>s;
void tarjan(int u)
{
	low[u]=dfn[u]=++tot;
	s.push(u);
	vis[u]=true;
	for(int i=head[u];i;i=a[i].next)
	{
		int v=a[i].v;
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v])low[u]=min(low[u],dfn[v]);
	}
	int x;
	if(dfn[u]==low[u])
	{
		kind++;
		do
		{
			x=s.top();
			color[x]=kind;
			vis[x]=false;
			s.pop();
		}while(u!=x);
	}
}
int dis[maxn];
bool pl[maxn];
void spfa()
{
	queue<int>q;
	memset(dis,-0x3f3f3f,sizeof(dis));
	dis[color[l]]=bottle[color[l]];
	pl[color[l]]=true;
	q.push(color[l]);
	while(!q.empty())
	{
		int u=q.front();
		pl[u]=false;
		q.pop();
		for(int i=head1[u];i;i=a1[i].next)
		{
			int w=a1[i].w;
			int v=a1[i].v;
			if(dis[u]+w>dis[v])
			{
				dis[v]=dis[u]+w;
				if(pl[v])continue;
				pl[v]=true;
				q.push(v);
			}
		}
	}
	int ans=-1;
	for(int i=1;i<=kind;i++)ans=max(ans,dis[i]);
	//ans+=bottle[color[l]];
	printf("%d",ans);
}
int main()
{
	/*freopen("ll.in","r",stdin);
	freopen("ll.out","w",stdout);*/
	scanf("%d%d",&n,&m);
	int x,y,z;
	double k;
	for(int i=1;i<=m;i++)
	{
  		scanf("%d%d%d%lf",&x,&y,&z,&k);
		add(x,y,z,k);
	}
	scanf("%d",&l);
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int u=1;u<=n;u++)
	{
		for(int i=head[u];i;i=a[i].next)
		{
			int v=a[i].v;
			if(color[u]==color[v])
			{
				int num=a[i].w;
				double res=a[i].f;
				while(num!=0)
				{
					a[i].w=a[i].w+(int)num*res;
					num=(int)num*a[i].f;
				}
				bottle[color[u]]+=a[i].w;
			}
		}
	}
	for(int u=1;u<=n;u++)
	{
		for(int i=head[u];i;i=a[i].next)
		{
			int v=a[i].v;
			int w=a[i].w;
			if(color[u]!=color[v])add1(color[u],color[v],bottle[color[v]]+w);
		}
	}
	spfa();
}
2021/7/9 15:53
加载中...