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. Hibernate实体类注解的问题

    刚刚和八千哥弄一个问题,这个很诡异的问题,困扰了我这么长时间.哎,说来惭愧. 用三大框架写毕设,结果今天获取前台数的时候,发现传值有个传不到. 我一开始用的是名为cows的数据,后来换了个数据库,加了 ...

  2. linux squid

    iptables -F iptables -F -t nat 网关 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERAD ...

  3. docker 版本变化及说明

    Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017年3月,有点类似于ubuntu的版本发布方式. 企业版自然会提供一些额外的服 ...

  4. .Net Core使用HttpClient请求Web API注意事项

    HttpClient 使用HttpClient可以很方便的请求Web API,但在使用时有一些需要注意的地方,不然会给你的程序带来毁灭性的问题. HttpClient是一个继承了IDisposable ...

  5. JS 面向对象详解

    面向对象详解1 OO1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  6. Python简单登录密码比对

    # 源于Github的一段源码,编写的比较规范,应该是专业选手! # encoding:utf-8 __author__ = 'www.yeayee.com' # 由本站增加注释,可随意Fork.Co ...

  7. CTF常见加密方式汇总

    1.栅栏密码 在IDF训练营里做过一道关于栅栏密码的问题. 栅栏密码的解法很简单,也有点复杂,字符长度因数多得会有很多个密码.对,栅栏密码的解法就是:计算该字符串是否为合数,若为合数,则求出该合数除本 ...

  8. [Swift]数学库函数math.h | math.h -- mathematical library function

    常用数学函数 1. 三角函数 double sin (double);//正弦 double cos (double);//余弦 double tan (double);//正切 2 .反三角函数 d ...

  9. C++与C的区别一

    1. C++风格数组初始化: #include <iostream> #include <array> using namespace std; void main() { / ...

  10. How to manage local libraries in IntelliJ IDEA

    如何在 IntelliJ IDEA 中管理本地类库 一般来说,如果项目是基于 Maven 管理工具的,我们会在 pom.xml 中添加 dependency 来管理依赖.但有时也会遇到要用的类库不在 ...