50pts求调
查看原帖
50pts求调
752619
Sorato_楼主2023/8/13 13:16

rt,输出和答案相差不大,差了 0.01∼0.030.01\sim0.03

#include<bits/stdc++.h>
#define reg register
using namespace std;
inline int read()
{
	int x=0;
	short f=1;
	char c=getchar();
	while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}
	while(c>='0'&&c<='9')	{x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
vector<int>e[1010];
vector<double>v2[1010],v1[1010];
int n,m,x,cnt[1010],dis[1010];
double l=0,r=1e12,eps=1e-6,mid,v[1010];
inline bool spfa()
{
	queue<int>q;q.push(1);
	while(q.size())
	{
		int u=q.front();q.pop();
//		printf("cnt[%d]=%d\n",u,cnt[u]);
		for(reg int i=0;i<e[u].size();i++)	
		{
			if(dis[e[u][i]]>dis[u]+v2[u][i])
			{
				dis[e[u][i]]=dis[u]+v2[u][i];
				q.push(e[u][i]);cnt[e[u][i]]=cnt[u]+1;
				if(cnt[e[u][i]]>=n)	return 1;
			}
		}
	}
	return 0;
}
inline bool check(double x)
{
//	cout<<"mid="<<x<<endl;
	for(reg int i=1;i<=n;i=-~i)
	{
		v2[i].clear();cnt[i]=0;dis[i]=i==1?0:0x3f3f3f3f;
//		cout<<cnt[i]<<' '<<dis[i]<<endl;
		for(reg int j=0;j<e[i].size();j=-~j)	v2[i].push_back(x*v1[i][j]-v[i]);
	}
	return spfa();
}
signed main()
{
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	n=read();m=read();
	for(reg int i=1;i<=n;i=-~i)	v[i]=read();
	for(reg int i=1;i<=m;i=-~i)	x=read(),e[x].push_back(read()),v1[x].push_back(read());
	while(l+eps<r)
	{
		mid=(l+r)/2;
		if(check(mid))	l=mid;
		else	r=mid;
	}
	printf("%.2lf\n",(check(l)?l:r));
//	for(reg int i=1;i<=n;i=-~i)	for(reg int j=0;j<e[i].size();j=-~j)	printf("dis[%d][%d]=%.0lf\n",i,e[i][j],v1[i][j]);	
	return 0;
}
2023/8/13 13:16
加载中...