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");    } }}


0 0
原创粉丝点击