find the safest road

  XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙 ^_^。

Input

  输入包括多个测试实例,每个实例包括: 
  第一行:n。n表示城市的个数n<=1000; 
  接着是一个n*n的矩阵表示两个城市之间的安全系数,(0可以理解为那两个城市之间没有直接的通道) 接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市。

Output

  如果86无法达到他的目的地,输出"What a pity!", 其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。

Sample Input

3
1 0.5 0.5
0.5 1 0.4
0.5 0.4 1
3
1 2
2 3
1 3

Sample Output

0.500
0.400
0.500

解题思路:
  本题有多组测试数据,每组给出城市的数量与其安全系数邻接矩阵,之后给出旅游线路数量与每条线路的起点与终点。

  本题几乎是dijkstra模板题,本题是使用dijkstra寻找最大安全系数,注意对安全系数是进行乘法运算。

  用一个double数组safety储存从起点到所有城市的最大安全系数,一个布尔数组记录是否固定对应城市的最大安全系数。初始状态将到所有城市的安全系数视为0,从起点开始标记,记录起点到自己的安全系数为1并将其固定,之后每次找到并固定到达起点安全系数最大的城市,固定一个城市后查看以该城市为媒介是否能使还没有固定的城市到达起点的安全系数增高,如果能优化,将优化后的记入该城市对应的safety中。

 #include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+;
int n, q, s;
double G[maxn][maxn]; //G记录邻接矩阵
double safety[maxn]; //safety记录起点到各城市的最大安全系数
bool vis[maxn] = {false}; //vis记录城市最大安全系数是否已经固定 void dijkstra(int s){ //传入起点
memset(safety, , sizeof(safety)); //初始化起点到所有城市的最大安全系数为0
memset(vis, false, sizeof(vis)); //所有城市都为未固定状态
safety[s] = 1.0; //起点到自己的最大安全系数为1
for(int i = ; i < n; i++){
//开始计算并固定城市最大安全系数,需要将每个城市都固定所以循环n次
int maxSafetyCity = -;
double maxSafetyNum = -;
for(int j = ; j < n; j++){ //找到还没有固定的城市中到起点安全系数最大的城市
if(!vis[j] && safety[j] > maxSafetyNum){
maxSafetyCity = j; //maxSafeCity记录还没有固定的城市中到起点安全系数最大的城市
maxSafetyNum = safety[j]; //maxSafetyNum记录当前最大安全系数
}
}
if(maxSafetyCity == -){ //如果找不到符合条件的城市,证明其余城市与起点不连通
return;
}
vis[maxSafetyCity] = true; //固定安全系数最大的城市
for(int j = ; j < n; j++){ //寻找以该城市为媒介可以优化的城市
if(!vis[j] && G[maxSafetyCity][j] != && G[maxSafetyCity][j] * safety[maxSafetyCity] > safety[j]){
//可以优化的条件为,该城市没有固定
//该城市与媒介城市连通
//从媒介城市到该城市的安全系数乘以媒介城市到起点的安全系数比不优化前该城市到达起点的安全系数高
safety[j] = safety[maxSafetyCity] * G[maxSafetyCity][j];
//优化
}
}
}
}
int main()
{
while(scanf("%d", &n) != EOF){ //输入城市数量
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
scanf("%lf", &G[i][j]); //输入邻接矩阵
}
}
scanf("%d", &q); //输入旅行路线
int ed;
for(int i = ; i < q; i++){
scanf("%d%d", &s, &ed); //输入起点与终点
dijkstra(s - ); //计算起点到所有城市的最大安全系数
if(safety[ed - ] != ){
printf("%.3f\n", safety[ed - ]); //格式化输出最大安全系数
}else{
printf("What a pity!\n"); //不连通
}
}
}
return ;
}

HDU1596 find the safest road的更多相关文章

  1. hdu1596 find the safest road - floyd

    2017-08-04 14:42:56 writer:pprp 题意: Problem Description XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每 ...

  2. 杭电 1595 find the safest road

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. hdoj 1596 find the safest road【最短路变形,求最大安全系数】

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. find the safest road

    find the safest road Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Othe ...

  5. hdu1569find the safest road(floyd变形求最大安全值)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. HDU 1596 find the safest road (最短路)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. hdu1596find the safest road(floyd)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. hdu 1596 find the safest road (最短路径)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. HDU.1596 find the safest road (Floyd)

    HDU.1596 find the safest road (Floyd) 题意分析 与普通的最短路不太相同,本题有些许的变化. 1. 要找到由i到j最安全的路,故在求解的时候要保证mp[i][j]尽 ...

随机推荐

  1. 开源WebGIS实施方案(五):基于SLD实现图层符号化及其应用

    SLD概述 SLD(OpenGIS® Styled Layer Descriptor):图层样式注记.其当前版本是1.1.0.SLD是一种描述地图图层样式的标准,一般用于WMS中的图层符号化. 说白了 ...

  2. C语言/C++编程学习:不做C/C++工作也要学C/C++的原因!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  3. Python学习之全局变量与global

    刚学习Python,遇到个问题:为什么有些定义在函数外的变量可以直接被函数使用,有些就不行呢? 如: count = 0 def change(): count += 1 change() # 报错 ...

  4. .Net Core MVC初学习

    .net core已经出来很长一段时间了,没有很好的学习过,现在工作不那么忙了,参考官方文档,在这里记录自己的学习过程! ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 ...

  5. WPF制作歌词动画

    最近再做一个UWP的音乐播放器,今天实现了歌词动画,不是滚动的,滚动的慢慢研究 思路:在右边放了三个textBlock,设置 textBlock的effect属性 <TextBlock.Effe ...

  6. 抓取DUMP日志

    http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx procdump -ma -c 60 -s 10 -n 3 <PID ...

  7. Android 如何查看源码 (eclipse 按住 ctrl )

    首先要确认 Android SDK Manager 下载并安装了 sources.然后在代码中按住 ctrl 在点一个类名, 如果打开的页面是找不到源码,就点那个按钮,然后找到源码所在的文件夹,就可以 ...

  8. Android 的一些中文文档

    https://blog.csdn.net/qq_36467463/article/details/77990089    //安卓mediaformat api详解 https://www.cnbl ...

  9. Linux基础命令(一)

    Linux语法命令 [选项] 参数注意:[]内容是对命令的扩张1.命令中单词之间空格隔开2.单行命令最多256个字符3.大小写区分 clear 清屏pwd 查看当前目录cd 切换目录    .表示当前 ...

  10. 记一次升级Ubuntu内核

      uname -a 查看当前使用内核版本 升级指定内核  apt-get install linux-image-4.4.0-131-generic dpkg --get-selections | ...