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. Orchard 介绍

    0.Introduction 下载地址 https://orchard.codeplex.com/ Orchard 是由微软公司创建,基于 ASP.NET MVC 技术的免费开源内容管理系统: 可用于 ...

  2. jQuery outerHeight() 方法

    outerHeight() 方法返回第一个匹配元素的外部高度. 如下面的图像所示,该方法包含 padding 和 border. 提示:如需包含 margin,请使用 outerHeight(true ...

  3. Devexpress Winform初学笔记

    作为一个软件开发人员来说,得有自己的博客,可以用来ZB,哈哈!玩笑话..... 写博客并不仅仅是用来ZB的,他可以用来记录你在技术道路上探索遇到的坎,当然也有提高逼格的次然因素啦!小弟刚入博客园不久, ...

  4. [JXOI2017]颜色 线段树求点对贡献

    [JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...

  5. 自注意力机制(Self-attention Mechanism)——自然语言处理(NLP)

    近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中.随着注意力机制的深入研究,各式各样的attention被研究者们提出.在2017年6月google机 ...

  6. 2018年秋PTA乙级回顾

    距离上次我一个人参加PAT考试已经过去快一个学期了,想想上次自己也是搞笑,自己一个人被这个书包就去了ZZ,人生地不熟的,乘坐公交车还坐反了.考完试因为不知道要等到考试结束就可以领取成绩证书,自己连那张 ...

  7. “全栈2019”Java第八十八章:接口中嵌套接口的应用场景

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. NOI2019省选模拟赛 第三场

    传送门 明明没参加过却因为点进去结果狂掉\(rating\)-- \(A\) 集合 如果我们记 \[f_k=\sum_{i=1}^nT^i{n-i\choose k}\] 那么答案显然就是\(f_{k ...

  9. 详解sizeof与strlen

    一,sizeof是C语言的一种单目运算符,与C语言的其他运算符++,--一样,它并不是函数:sizeof()以字节为单位给出了操作数的大小:sizeof的值是无符号int. strlen是一个函数,只 ...

  10. centos和ubuntu配置路由的三种方式

    本篇总结三种修改路由的方式:route, ip route, 以及通过修改文件来配置路由,前2种命令行形式适用于ubuntu和centos,重启失效,最后一种永久有效.     一. route命令 ...