P1730 最小密度路径

题面

题目描述

给出一张有 \(N\) 个点 \(M\) 条边的加权有向无环图,接下来有 \(Q\) 个询问,每个询问包括 \(2\) 个节点 \(X\) 和 \(Y\) ,要求算出从 \(X\) 到 \(Y\) 的一条路径,使得密度最小(密度的定义为,路径上边的权值和除以边的数量)。

输入输出格式

输入格式:

第一行包括 \(2\) 个整数 \(N\) 和 \(M\) 。

以下 \(M\) 行,每行三个数字 \(A\) 、 \(B\) 、 \(W\) ,表示从 \(A\) 到 \(B\) 有一条权值为 \(W\) 的有向边。

再下一行有一个整数 \(Q\) 。

以下 \(Q\) 行,每行一个询问 \(X\) 和 \(Y\) ,如题意所诉。

输出格式:

对于每个询问输出一行,表示该询问的最小密度路径的密度(保留 \(3\) 位小数),如果不存在这么一条路径输出“OMG!”(不含引号)。

输入输出样例

输入样例:

3 3
1 3 5
2 1 6
2 3 6
2
1 3
2 3

输出样例:

5.000
5.500

说明

\(1 \leq N \leq 50, 1 \leq M \leq 1000, 1 \leq W \leq 100000, 1 \leq Q \leq 100000\)

思路

我们来做一点 \(NOIP D1T2\) 难度的图论题吧......来,洛谷 P4467。 --digger_sun

下午孙教练突然叫我们过去做了一些图论题,太毒瘤了 \(qwq\) 。特别是这道题,我没有做出来,因为完全没和动态规划联系到一起。最后则是 logeadd 的代码救了我。

进入正题。显然普通的松弛操作在这里不适用了,考虑使用记录状态的动态规划。定义 \(dis[i][j][k]\) 为从 \(i\) 点出发到达 \(j\) 点,中途恰好经过了 \(k\) 条边的最短距离。那么假设在从点 \(s\) 出发的一次最短路中,现在的状态是已经经过了 \(k\) 条边的点 \(u\) 和它的最短路径,对于一条边 \((u,v,d)\) 我们就可以这样松弛:

\[f[s][v][k+1]=min(f[s][v][k+1],f[u][v][k]+d)
\]

最后统计答案时枚举经过的边数,就可以完成啦。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;
int n,m,q,dis[55][55][1005];
int cnt,top[55],to[1005],len[1005],nex[1005];
int read()
{
int re=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
void SPFA(int s)
{
dis[s][s][0]=0;
queue<PII>Q;
Q.push(make_pair(s,0));
while(!Q.empty())
{
int now=Q.front().first,edge=Q.front().second;Q.pop();
for(int i=top[now];i;i=nex[i])
if(dis[s][to[i]][edge+1]>dis[s][now][edge]+len[i])
{
dis[s][to[i]][edge+1]=dis[s][now][edge]+len[i];
Q.push(make_pair(to[i],edge+1));
}
}
return ;
}
int main()
{
n=read(),m=read();
memset(dis,0x3f,sizeof dis);
for(int i=0;i<m;i++)
{
int x=read(),y=read(),z=read();
to[++cnt]=y,len[cnt]=z,nex[cnt]=top[x],top[x]=cnt;
}
q=read();
while(q--)
{
int s=read(),t=read();
SPFA(s);
double ans=INF;
for(int i=1;i<=m;i++) if(dis[s][t][i]!=INF) ans=min(ans,double(dis[s][t][i])/double(i));
if(ans!=INF) printf("%.3f\n",ans);
else puts("OMG!");
}
return 0;
}

Luogu P1730 最小密度路径(最短路径+dp)的更多相关文章

  1. [Luogu 1730]最小密度路径

    Description 给出一张有N个点M条边的加权有向无环图,接下来有Q个询问,每个询问包括2个节点X和Y,要求算出从X到Y的一条路径,使得密度最小(密度的定义为,路径上边的权值和除以边的数量). ...

  2. [洛谷P1730] 最小密度路径

    类型:Floyd 传送门:>Here< 题意:定义一条路径密度 = 该路径长度 / 边数.给出一张$DAG$,现有$Q$次询问,每次给出$X,Y$,问$X,Y$的最小密度路径($N \le ...

  3. 洛谷P1730 最小密度路径(floyd)

    题意 题目链接 Sol zz floyd. 很显然的一个dp方程\(f[i][j][k][l]\)表示从\(i\)到\(j\)经过了\(k\)条边的最小权值 可以证明最优路径的长度一定\(\leqsl ...

  4. 洛谷P1730最小密度路径

    题目传送门; 首先理解题目,究其本质就是一个最短路问题,而且数据范围贼水,用floyd完全没问题,但是题目有变化,要求出路径边权值与边数之比,这里就可以考虑在把floyd中的二维数组变为三维,f[ i ...

  5. 【洛谷P1730】最小密度路径

    题目大意:给定一个 N 个点,M 条边的有向图,现有 Q 个询问,每次询问 X 到 Y 的最小密度路径是多少.最小密度路径的定义是路径长度除以路径边数. 题解:利用矩阵乘法,可以预处理出从 X 到 Y ...

  6. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  7. luogu P2764 最小路径覆盖问题

    题目描述 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任 ...

  8. Luogu 1613 跑路(最短路径,倍增)

    Luogu 1613 跑路(最短路径,倍增) Description 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是 ...

  9. Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

    Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...

随机推荐

  1. WebClient 上传文件 上传文件到服务器端

    一直对于上传文件到服务器端困惑:以前,现在,学到了关于WebClient的post知识 瞬间对于上传文件到服务器觉得好轻松: 原理很简单:我们通过post服务器的页面:把本地的文件直接传递过去: 现在 ...

  2. 最全Linux常用命令大全

    查看系统系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMB ...

  3. Linux 实用指令(8)--网络配置

    目录 网络配置 1 Linux网络配置原理图(含虚拟机) 2 查看网络IP和网关 2.1 查询虚拟网络编辑器 2.2 修改IP地址(修改虚拟网络的IP) 2.3 查看网关 2.4 查看windows环 ...

  4. 2018-8-10-win10-uwp-使用资源在后台创建控件

    title author date CreateTime categories win10 uwp 使用资源在后台创建控件 lindexi 2018-08-10 19:17:19 +0800 2018 ...

  5. tensorflow识别验证码(1)-tensorflow安装,验证码生成

    什么是TensorFlow?  TensorFlow是Google开发的一款神经网络的Python外部的结构包, 也是一个采用数据流图来进行数值计算的开源软件库.TensorFlow 让我们可以先绘制 ...

  6. java.util.concurrent中的几种同步工具类

    java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...

  7. iOS之CALayer属性简介

    /* CoreAnimation - CALayer.h Copyright (c) 2006-2017, Apple Inc. All rights reserved. */ #import < ...

  8. 手势UIGestureRecognizer

    UIGestureRecognizer抽象类,六大手势是其子类: UITapGestureRecognizer      点击 UIPinchGestureRecognizer         缩放 ...

  9. SPSS科普 | 统计描述

    SPSS科普 | 统计描述 统计描述的目的就是了解数据的基本特征和分布规律,为进一步合理地选择统计方法提供依据.常用的有Frequencies.Descriptives 和Explore过程. 一.F ...

  10. springcloud(二):Eureka服务注册与发现

    Spring Cloud Netflix  该项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix ...