题目https://www.luogu.com.cn/problem/P5837
温馨提示:鉴于数据范围小的可怜,我们可以用暴力一些的想法去做,别看到是普及+/提高就被吓退了。
枚举最小流量 ,然后跑一遍最短路,求出带限制的 到 的最短路的长度,然后算出 的结果,和答案()取最大值。
思路简单粗暴,代码也就 行左右,应该是不算难。
实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,dis[1005],ans=-1e18;
vector<pair<int,pair<int,int>>>v[1005];
bool vis[1005];
void Dijkstra(int MID){
fill(dis,dis+n+1,1e18);
fill(vis,vis+n+1,false);
int Begin=1;
dis[Begin]=0;
priority_queue<pair<int,int>>q;
q.push({dis[Begin],Begin});
while(q.size()){
auto p=q.top();
q.pop();
if(!vis[p.second]){
vis[p.second]=true;
for(auto z:v[p.second]){
if(!vis[z.first]&&z.second.second>=MID&&dis[z.first]>dis[p.second]+z.second.first){
dis[z.first]=dis[p.second]+z.second.first;
q.push({-dis[z.first],z.first});
}
}
}
}
if(dis[n]!=1e18){
int zoz=(MID/double(dis[n]))*1000000.0;
ans=max(zoz,ans);
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
int minn=1e18,maxn=-1e18;
for(int i=1,x,y,z,k;i<=m;i++){
cin>>x>>y>>z>>k;
v[x].push_back({y,{z,k}});
v[y].push_back({x,{z,k}});
minn=min(minn,k),maxn=max(maxn,k);
}
for(int i=minn;i<=maxn;i++){
Dijkstra(i);
}
cout<<ans;
return 0;
}