90pts 半随机化暴力算法求卡
查看原帖
90pts 半随机化暴力算法求卡
743014
_H17_楼主2024/10/13 14:18
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define int long long 
using namespace std;
using namespace __gnu_pbds;
constexpr int INF=1e18;
int n,m,ans;
vector<tuple<int,int,int> >e[1001];
gp_hash_table<int,int>dis[1001];//dis[i]表示到i的花费是j的最大流量 
void dijkstra(){
	std::priority_queue<tuple<int,int,int>,vector<tuple<int,int,int> >,less<tuple<int,int,int> > >q;
	q.push(make_tuple(INF,0,1));
	dis[1][0]=INF;
	while(!q.empty()){
//		auto [d,u]=q.top();
		int d=get<0>(q.top()),c=get<1>(q.top()),u=get<2>(q.top());
		q.pop();
		if(dis[u][c]!=d)
			continue;
		for(auto p:e[u]){
			int v=get<0>(p),w=get<1>(p),f=get<2>(p);
			if(c+w>5000)//硬跳过去来剪枝
				continue;
			if(!dis[v][c+w]){
				dis[v][c+w]=min(dis[u][c],f);
				q.push(make_tuple(dis[v][c+w],c+w,v));
				continue;
			}
			if(min(dis[u][c],f)>dis[v][c+w]){
				dis[v][c+w]=min(dis[u][c],f);
				q.push(make_tuple(dis[v][c+w],c+w,v));
			}
		}
	}
	return;
}
signed main(){
    srand(time(0));
	cin>>n>>m;
	for(int i=1,u,v,c,f;i<=m;i++){
		cin>>u>>v>>c>>f;
		e[u].push_back(make_tuple(v,c,f)),
		e[v].push_back(make_tuple(u,c,f));
	}
	dijkstra();
	for(auto it=dis[n].begin();it!=dis[n].end();it++)
		ans=max(ans,(int)(1000000.0*(it->second)/(it->first)));
	cout<<ans;
	return 0;
}
2024/10/13 14:18
加载中...