hdu1596find the safest road
来源:互联网 发布:淘宝网卖家客服 编辑:程序博客网 时间:2024/05/16 19:05
题目大意:
XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙 ^_^
解题思路:
可以用dijkstra解本题,稍微做一点改动就可以了!
什么是dijkstra算法?
我们先看一张图解,左边的是dijstra算法的思想,右边的是一张无向图。
解释:
V0是起点,1~6代表的是终点,边上的数是路径长。对于dijstra算法,其实就是维护两个集合,一个是已经求出的点的集合S,另一个是还没有求出来的点的集合U。这两个集合之间有着什么样的关系呢?
(1) 第一步应该是将起点V0放入集合S,因为起点到起点的路径长度肯定是0,然后我们在集合U中中找到一个点Ui,使得起点到该点的距离比到其它点的距离都短,然后将这个点加入S集合中,但是这样就可以确定这条路径就是V0到Ui的最短距离了嘛?从图上来看,我们第一步将要选择的是V-5它的路径长度是2,仔细观察之后发现这条路径确实是最短的了。可是要怎么证明呢?
首先假设存在另外一条路径V-K-5使得V-k-5<v-5,可能吗?都说了V到5的距离是比V到其它点的距离都要短,所以V-k<V-5,与假设V-k-5<V-5矛盾!原命题成立。
(2)第二步就是要利用第一步找到的这个点,来更新一下起点到各个点的最短距离,怎么利用呢?我们知道起点V0到其它各点Ui之间肯定不只有一条路径,但总的来说就分两种,一是直达的(当然可以不存在)如图中的lin1,还有一种就是经过其他点然后到达Ui的(也可以不存在),而我们第二步就是要利用第一步里面找到的各点的最短距离,来比较lin1和lin2的大小,然后更新。(由于S集合中的点的最短路径都是缺点的,所以如果S集合中的各个点如果和U中的点存在路径lin2,且小于Lin1的话就更新lin1=lin2)
(3)第三步就是不断的重复上面两步直到U为空集。
#include<stdio.h>#define N 1009double Map[N][N],dis[N];double dijkstra(int s,int e,int n){ int i,j,u; double big; bool S[N]; for(i=1;i<=n;i++){ dis[i]=Map[s][i]; S[i]=false; } S[s]=true; for(i=1;i<=n;i++){ big=-1; u=s; for(j=1;j<=n;j++){ if(!S[j]&&dis[j]>big){ u=j; big=dis[j]; } } S[u]=true; for(j=1;j<=n;j++){ if(!S[j]&&dis[j]<dis[u]*Map[u][j]) dis[j]=dis[u]*Map[u][j]; } if(u==e) return dis[e]; } return 0;}int main(){ int n,m; double temp; int s,e; while(scanf("%d",&n)!=EOF){ int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ scanf("%lf",&Map[i][j]); } scanf("%d",&m); while(m--){ scanf("%d%d",&s,&e); temp=dijkstra(s,e,n); if(temp) printf("%.3lf\n",temp); else printf("What a pity!\n"); } }}
- hdu1596find the safest road
- hdu1596find the safest road
- hdu1596find the safest road 逆dijkstra
- hdu1596find the safest road(Dijkstra)
- hdu1596find the safest road最短路floyd
- HDU1596find the safest road(floyd)
- HDU1596find the safest road(最短路径)
- find the safest road
- find the safest road
- find the safest road
- find the safest road
- find the safest road
- find the safest road
- find the safest road
- find the safest road
- HDOJ find the safest road
- hdu1596 find the safest road
- hdu1596 find the safest road
- 抽象类
- oracle 删除字段方法 alter table set unused
- 软件工程推荐书单【读书笔记】代码大全35章:更多书籍
- Onvif框架代码生成流程
- JAVA学习笔记(类初始化变量)
- hdu1596find the safest road
- HYSBZ - 1026 (数位dp)
- 训练计划(for acm...)
- Linux简介
- Hibernate缓存机制
- JdbcTemplate中execute和update的区别
- 纸牌函数生成器
- uitextview 字数限制
- 【华为编程大赛】实现一个开放的书名检索库