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. scvmm sdk之powershell(一)

    shell表示计算机操作系统中的壳层,与之相对的是内核,内核不能与用户直接交互,而是通过shell为用户提供操作界面,shell分为两类,一种提供命令行界面,一种提供图形界面.windows powe ...

  2. 使用Eclipse切换TFS工作区

    这个问题首先牵涉到两个概念: - Eclipse的工作区:Eclipse的工作区是运行Eclipse时需要连接的本地代码空间,默认情况下,在Eclipse中创建的项目都保存在Eclipse的工作区中 ...

  3. Linux TCP不同状态的连接数统计

    方法一:利用netstat命令 统计 TIME_WAIT/CLOSE_WAIT/ESTABLISHED/LISTEN 等TCP状态的连接数 netstat -tan |grep ^tcp |awk ' ...

  4. Xamarin.Android RelativeLayout

    初次接触Xamarin.Android. 由于国内Xamarin的资料少见,我大多参考JAVA原生代码,慢慢摸索过来. 我把摸索出来的结果广而告之,希望后来人能少走一点弯路,也希望你也能做出一份贡献. ...

  5. WPF成长之路------翻转动画

    先介绍一下RenderTransform类,该类成员如下: TranslateTransform:能够让某对象的位置发生平移变化. RotateTransform:能够让某对象产生旋转变化,根据中心点 ...

  6. 当我们在谈论multidex65535时,我们在谈论什么

    本文来自网易云社区 作者:郑文 首先我们并不在讨论车牌号.本文尽量避免谈论重复的技术点,只探讨一下multidex提供给我们的技术启示. 原理 multidex技术原理可以分成两个部分: 在app启动 ...

  7. Amazon新一代云端关系数据库Aurora(下)

    本文由  网易云发布. 作者:郭忆 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 故障恢复 MySQL基于Check point的机制,周期性的建立redo log与数据页的一致点.一旦数据库 ...

  8. 1415: 小ho的01串 [字符串]

    点击打开链接 1415: 小ho的01串 [字符串] 题目描述 有一个由0和1组成的字符串,它好长呀--------一望无际 恩,说正题,小ho的数学不太好,虽然是学计算机的但是看见0和1也是很头疼的 ...

  9. 使用TortoiseSVN客户端管理IntelliJ IDEA项目的方法

    使用TortoiseSVN客户端管理IntelliJ IDEA项目的方法 今天在打开一个使用SVN管理的项目时,IntelliJ IDEA提示: Can't use Subversion comman ...

  10. Solr7.4的学习与使用

    学习的原因: 17年的时候有学习使用过lucene和solr,但是后来也遗忘了,最近公司有个项目需要使用到全文检索,正好也顺便跟着学习一下,使用的版本是Solr7.4的,下载地址:http://arc ...