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. C#冒泡排序(完整代码)

    百度百科 冒泡排序是笔试面试经常考的内容,虽然它是这些算法里排序速度最慢的 原理:从头开始,每一个元素和它的下一个元素比较,如果它大,就将它与比较的元素交换,否则不动. 这意味着,大的元素总是在向后慢 ...

  2. Linux CentOS环境下.Net Core SDK安装

    1.安装.Net SDK 在安装.NET之前,需要注册产品存储库并安装所需的依赖关系. 打开Linux命令提示符并运行以下命令: sudo rpm -Uvh https://packages.micr ...

  3. 毕业回馈—89C51之GPIO使用

    STC89C51系列单片机共有如下几类GPIO口: (1)P0.0-P0.7: 对应DIP40封装的39-32号引脚:P0口既可以作为输入/输出GPIO口,也可以作为地址/数据复用总线使用. a)P0 ...

  4. java—实现一个监听器HttpServletRequest的创建销毁、在线人数 (56)

    在JavaWeb中的监听器分类 在Javaweb中存在三个被监听对象: HttpServletRequest HttpSessoin ServletContext 监听者 被监听者 监听到事件对象 H ...

  5. 服务器变量 $_SERVER 详解

    摘抄:http://ha.cker.in/942.seo 1.$_SESSION[‘PHP_SELF’] — 获取当前正在执行脚本的文件名 2.$_SERVER[‘SERVER_PROTOCOL’] ...

  6. flask接收前台的form数据

    转自 http://www.cnblogs.com/wanghaonull/p/6340096.html 我主要是想了解 request.form.get('username') 这一部分

  7. 【bug】—— IE8 ajax 报错:no transport

    如题,我使用$.ajax()方法请求数据,在现代浏览器中工作正常,但在 IE 8 下,会有报错:no transport 从 stackoverflow 中获知,出现这个问题是因为** IE 8 不支 ...

  8. 算法导论-MIT笔记

    第一部分 Analysis of Algorithms 算法分析是关于计算机程序性能(performance)和资源利用的理论研究 1 What's more important than perfo ...

  9. Fleury算法

    关于为什么不选桥 因为选桥之后会变成两个联通分支,这时由于可能产生的新联通分支不是孤立顶点,他俩都不联通了,那么也就绝对不可能“一笔画”走下来了 关于为什么可以选除桥之外的任意一条边走 本质原因是因为 ...

  10. 在Azuer创建自己的Linux_VM

    ---恢复内容开始--- emm..就是想搭个自己的VPN去YouTube看看视屏找找资源什么的... (滑稽.jpg)然后发现似乎需要这个玩意儿 先去申请一个Azuer账户 然后根据要求一步步来就好 ...