P1730 最小密度路径

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1730 最小密度路径相关的知识,希望对你有一定的参考价值。

P1730 最小密度路径

有向带权无环图,求任意两点最小的(边权和除以个数)。

思路1

floyd

求任意两点最短路问题容易想到floyd,因为本题还需考虑边的个数,所以考虑枚举边数,令 d p ( i , j , k ) dp(i,j,k) dp(i,j,k)表示边个数为 k k k时的最短路。

转移方程就类似 f l o y d floyd floyd d p ( i , j , k ) = m i n ( d p ( i , x , k − 1 ) + d p ( x , j , 1 ) , d p ( i , j , k ) ) dp(i,j,k)=min(dp(i,x,k-1)+dp(x,j,1),dp(i,j,k)) dp(i,j,k)=min(dp(i,x,k1)+dp(x,j,1),dp(i,j,k))

然后计算答案的时候就扫一遍 k k k m i n min min即可。

时间复杂度: O ( n 4 ) O(n^4) O(n4)

// Problem: P1730 最小密度路径
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1730
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-11-14 18:12:52
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=55,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

int n,m,q;
int f[N][N][N];
int d[N][N];
int main()
	scanf("%d%d",&n,&m);
	rep(i,1,n)
		rep(j,1,n)
			rep(k,1,n-1)
				f[i][j][k]=inf;
		
	rep(i,1,m)
		int u,v,w;scanf("%d%d%d",&u,&v,&w);
		if(w<f[u][v][1]) f[u][v][1]=w;
	
	for(int k=2;k<n;k++)	
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				for(int x=1;x<=n;x++)
					f[i][j][k]=min(f[i][j][k],f[i][x][k-1]+f[x][j][1]);
				
	scanf("%d",&q);
	while(q--)
		int u,v;scanf("%d%d",&u,&v);
		double ans=1e18;
		for(int i=1;i<n;i++)
			if(f[u][v][i]==inf) continue;
			ans=min(ans,(double)f[u][v][i]/i);
		
		if(ans==1e18)
			puts("OMG!");
		
		else printf("%.3f\\n",ans);
	
	return 0;

思路2

分数规划+二分

s u m k < a n s \\dfracsumk<ans ksum<ans

s u m − k × a n s < 0 sum-k\\times ans <0 sumk×ans<0

若存在 a n s ans ans,满足每条边的 w i − a n s w_i-ans wians 的路径和 < 0 <0 <0,则可以更新答案,这显然是可以二分答案的。

每次就跑一遍 s p f a spfa spfa即可。

时间复杂度: O ( n l o g m × l o g M x ) O(nlogm\\times logMx) O(nlogm×logMx)

以上是关于P1730 最小密度路径的主要内容,如果未能解决你的问题,请参考以下文章

数据的核密度估计及其可视化:Python实现

数据的核密度估计及其可视化:Python实现

数据的核密度估计及其可视化:Python实现

网络流常见建图套路总结(重制版)

MMA算法的推导及3D简支梁拓扑优化代码详解

iOS xcode 代码片段