【floyd】8.29题解-path
path
题目描述
这次的任务很简单,给出了一张有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
说明
数据范围
对于60%的数据,有1 ≤ N ≤ 10,1 ≤ M ≤ 100,1 ≤ W ≤ 1000,1 ≤ Q ≤ 1000;
对于100%的数据,有1 ≤ N ≤ 50,1 ≤ M ≤ 1000,1 ≤ W ≤ 100000,1 ≤ Q ≤ 100000。
思路
100%的数据只有不到50个点,所以floyd可以稳过
具体做法
在朴素的floyd上多加一维,f[x][y][t];
t代表x,y间的边数。
即:
f[x][y][1]=从x到y经过一条边时,最短的距离
f[x][y][2]=从x到y经过两条边时,最短的距离
······
所以有map[i][j][t]=min(map[i][j][t],map[i][k][t-1]+map[k][j][1]);
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxx=17258205;
const int maxn=55;
int n,m,q;
double map[maxn][maxn][maxn];
double d[maxn][maxn];
inline int read() {
int x=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
return x*w;
}
inline void add(int from,int to,double dist) {
map[from][to][1]=min(map[from][to][1],dist);
}
inline void density() {
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=n; k++)
if(map[i][j][k]!=maxx)d[i][j]=min(d[i][j],map[i][j][k]/k);
}
void floyd() {
for(int t=2; t<=n; t++)
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
map[i][j][t]=min(map[i][j][t],map[i][k][t-1]+map[k][j][1]);
density();
}
int main() {
//freopen("path.in","r",stdin);
//freopen("path.out","w",stdout);
n=read();
m=read();
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
for(int k=1; k<=n; k++)
map[i][j][k]=maxx;
d[i][j]=maxx;
}
for(int i=1; i<=m; i++) {
int x,y,v;
x=read(),y=read(),v=read();
add(x,y,v);
}
floyd();
q=read();
for(int i=1; i<=q; i++) {
int x,y;
x=read(),y=read();
if(d[x][y]==maxx) cout<<"OMG!"<<endl;
else printf("%0.3lf\n",d[x][y]);
}
return 0;
}
【floyd】8.29题解-path的更多相关文章
- POJ 3660 Cow ContestCow(Floyd传递闭包)题解
题意:给出m个关系,问你能确定机头牛的排名 思路:要确定排名那必须要把他和其他n-1头牛比过才行,所以Floyd传递闭包,如果赢的+输的有n-1就能确定排名. 代码: #include<cstd ...
- Wannafly挑战赛29题解
这套题目非常有意思啊23333--话说为啥没有上条先生的呢-- 传送门 \(A\) 御坂美琴 蠢了--首先先判总共加起来等不等于\(n\),不是的话就不行 然后dfs记录\(n\)不断分下去能分成哪些 ...
- HZOI20190822模拟29题解
题面:https://www.cnblogs.com/Juve/articles/11396238.html 下面开始一句话题解: A:爬山: 二分答案,check即可 #include<ios ...
- 【贪心】8.29题解-cut
cut 题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同 ...
- 图论算法(二)最短路算法:Floyd算法!
最短路算法(一) 最短路算法有三种形态:Floyd算法,Shortset Path Fast Algorithm(SPFA)算法,Dijkstra算法. 我个人打算分三次把这三个算法介绍完. (毕竟写 ...
- Floyd算法(一)之 C语言详解
本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3 ...
- Codevs1992题解
题目大意 求有向图中经过某一点k的最大环(数据规模不支持floyd). 题解 以k为起点在正向图中spfa求单源最短路.再在反向图中spfa求单源最短路. 枚举除k外的每个点i.假设有一个同一时候包括 ...
- WPF Path总结(一)
首先来看看Path的定义,参考MSDN:绘制一系列相互连接的直线和曲线.介绍比较简单,我们再来看看备注中有些什么,Path 对象可以绘制封闭式还是开放式形状. 多个形状和甚至曲线的形状.与不 Line ...
- (原创)Python文件与文件系统系列(3)——os.path模块
os.path 模块实现了一些操作路径名字符串的函数,可以通过 import os.path 使用该模块,不过即使仅仅 import os 也可以使用该模块的方法. 1. abspath(path) ...
随机推荐
- NtQuerySystemInformation获取进程/线程状态
__kernel_entry NTSTATUS NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass, P ...
- 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案
阅文时长 | 0.72分钟 字数统计 | 1164.8字符 主要内容 | 1.问题起因及解决方案 2.安装jdk-8u241-windows-x64 3.取消PolyBase查询服务 4.四.声明与参 ...
- 优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作
优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作 发布时间:2019-06-27 09:00:15 点击次数:2847 在前几期教程中,小编介绍了如何在虚拟机中安装和使用优麒麟,接下来,小 ...
- google 谷歌Python语言规范
Python语言规范 https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_lan ...
- (代替人类)很多操作都在Settings里面。 5.安装第三方库
2020-02-01 pycharm 使用教程 LingSmart关注 0.0842020.02.07 15:08:50字数 1,394阅读 680 实在无聊,就来学习吧.学习pycharm的使用教程 ...
- 如何访问pod --- service(7)
一.通过service访问pod 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller ...
- Centos6.8安装mysql 步骤
第1步.查看CentOS下是否已安装mysql 输入命令 :yum list installed | grep mysql 第2步.删除已安装mysql 输入命令:yum -y remove mysq ...
- python基础之面向对象(三))(实战:烤地瓜(SweetPotato))
一.分析"烤地瓜"的属性和方法 示例属性如下: cookedLevel : 这是数字:0~3表示还是生的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了!我们的 ...
- SpringMVC MVC 架构模式
MVC 架构模式 MVC(Model.View 和 Controller)是一种架构模式,它是按照职责划分的思想将系统操作分为三个模块进行处理,每个模块负责一个职责,而且模块之间可以相互交互通信,共同 ...
- 防火墙 firewall iptables
firewalld FirewallD 使用服务service 和区域zone来代替 iptables 的规则rule和链chain,默认情况下,有以下的区域zone可用: drop – 丢弃所有传入 ...