蒟蒻求调
  • 板块P1768 天路
  • 楼主Tudoudidan
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/3 14:04
  • 上次更新2025/2/3 19:42:07
查看原帖
蒟蒻求调
773444
Tudoudidan楼主2025/2/3 14:04
#include<bits/stdc++.h>
using namespace std;
int n,vis[22222],h[22222],sum[22222],T,cnt,m,t1,t2;
double dis[22222],t3,t4;
struct node{
	int to,nxt;
	double dis,p;
}e[11111];

void add(int t1,int t2,double t3,double t4){
	cnt++;
	e[cnt].to = t2;
	e[cnt].dis = t3;
	e[cnt].nxt = h[t1];
	e[cnt].p = t4;
	h[t1] = cnt;
}

bool  bfs(int first,double mid){
	queue<int>q;
	for(int i=1;i<=n;++i)dis[i]=1e15;
	memset(vis,0,sizeof vis);
	memset(sum,0,sizeof sum);
	dis[first] =0;
	vis[first] =1;
	q.push(first);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x] = 0;
		for(int i=h[x];i;i = e[i].nxt){
			int y = e[i].to;
			if(dis[y]>dis[x]+e[i].dis-e[i].p*mid){
				dis[y] = dis[x]+e[i].dis-e[i].p*mid;
				sum[y]=sum[x]+1;
				if(sum[y]>n)return 1;
				if(vis[y]==0){
					vis[y] = 1;
					q.push(y);
				}
			}
		}
	}
	return 0;
}

bool f(double mid){
	for(int i = 1;i<=n;i++)if(bfs(i,mid))return 1;
	return 0; 
}

int main(){
	cin>>n>>m;
	for(int i =0;i<m;i++){
		cin>>t1>>t2>>t3>>t4;
		add(t1,t2,t3,t4);
	}
	double l = 0,r = 1e7,mid;
	while(fabs(l-r)>1e-2){
	//	cout<<l<<' '<<r<<endl;
		mid = (l+r)/2;
		if(f(mid))r = mid;
		else l = mid;
	}
	printf("%.1lf",l);
}
2025/2/3 14:04
加载中...