警钟撅烂 如果你WA 90 on #4
  • 板块P1768 天路
  • 楼主Mr_RedStone
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/16 15:22
  • 上次更新2024/3/16 16:47:03
查看原帖
警钟撅烂 如果你WA 90 on #4
766436
Mr_RedStone楼主2024/3/16 15:22

死亡代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int u[20005],v[20005],x[20005],y[20005];
double dis[7005];
bool check(double t){
	for(int i=0;i<=n;i++){
		dis[i]=-1e100;
	}
	dis[1]=0;
	int cnt=1;
	while(true){
		if(cnt>n){
			return 1;
		}
		bool f=0;
		for(int j=1;j<=m;j++){
			if(dis[u[j]]+x[j]-t*y[j]-dis[v[j]]>1e-7){
				dis[v[j]]=dis[u[j]]+x[j]-t*y[j];
				f=1;
			}
		}
		if(!f){
			break;
		}
		cnt++;
	}
	return 0;
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d %d %d %d",&u[i],&v[i],&x[i],&y[i]);
	}
	int l=0,r=2000000,ans=-114514;
	while(l<=r){
		int t=(l+r)>>1;
		if(check(t/10000.0)){
			l=t+1;
			ans=t;
		}
		else{
			r=t-1;
		}
	}
	if(ans==-114514){
		printf("-1");
	}
	else{
		printf("%.1f",ans/10000.0);
	}
	return 0;
}

死因:1e-100太大了,造成了精度问题,改成1e-10就行了

2024/3/16 15:22
加载中...