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,k−1)+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 sum−k×ans<0
若存在 a n s ans ans,满足每条边的 w i − a n s w_i-ans wi−ans 的路径和 < 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 最小密度路径的主要内容,如果未能解决你的问题,请参考以下文章