20pts求调
  • 板块P1768 天路
  • 楼主Him_shu
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/10 15:16
  • 上次更新2024/11/10 16:55:31
查看原帖
20pts求调
905885
Him_shu楼主2024/11/10 15:16
#include<bits/stdc++.h>
using namespace std; 
#define int long long
const int N=2e5+5,inf=1e14;
int n,m;
int dis[N],pre[N],cnt[N];
bool vis[N];
struct info{
	int v,p,q;
};
vector<info>g[N];
int spfa(int x){
	memset(dis,0,sizeof(dis));
	memset(cnt,0,sizeof(cnt));
	memset(pre,0,sizeof(pre));
	memset(vis,0,sizeof(vis));
	queue<int>sk;
	for(int i=1;i<=n;i++)dis[i]=inf;
	dis[1]=0;
	vis[1]=1;
	pre[1]=1;
	sk.push(1);
	while(!sk.empty()){
		int u=sk.front();
		sk.pop();
		vis[u]=0;
		for(auto [v,p,q]:g[u]){
			int w=x*q-p;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				pre[v]=u;
				if(cnt[v]>=n)return 1;
				if(!vis[u])sk.push(v),vis[v]=1;
			}
		}
	}
	return 0;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int u,v,p,q;
		cin>>u>>v>>p>>q;
		g[u].push_back({v,p,q});
		g[v].push_back({u,p,q});
	}
	double l=0,r=1e5,ans=-1;
	while(r-l>=0.001){
		double mid=(l+r)/2;
		if(!spfa(mid)){
			ans=mid;
			r=mid;
		}
		else{
			l=mid;
		}
	}
	printf("%.1f",ans);
    return 0;
}
2024/11/10 15:16
加载中...