poj 2472 106 miles to Chicago

来源:互联网 发布:淘宝非法交易如何退货 编辑:程序博客网 时间:2024/05/22 10:36

题目故事很有趣。其实就是让你找一条路径,这个路径最安全,被定义为最不可能被警察抓到的路。

输入的文本包含多组测试数据,每组第一行为两个整数n,m。n为交叉路口的数目,m为街道的数目,接下来m行来描述每一个 街道,输入a,b,p。a,b为这条街道的两个交叉路口,p为同个这个街道不能被抓到的概率。街道时双向的。

最短路的变形,把路径最短的三角不等式转化为概率最大就好了。

#include<iostream>    #include<cstdio>    #include<cstring>    #include<string>    using namespace std;    const int N = 110;    double Graph[N][N];    int n,m;    void dijkstra()    {        bool vis[N];        double dis[N];        for(int i = 1 ; i <= n ; i++)        {            dis[i] = Graph[1][i];            vis[i] = false;        }        dis[1] = 1.0;        vis[1] =  true;        for(int i = 2 ; i <= n ; i++)        {            int k;            double maxx = 0.0;//比较类型的一致            for(int j = 2 ; j <= n ; j++)            {                if(!vis[j] && dis[j] > maxx)                {                    k = j;                    maxx = dis[j];                }            }            vis[k] = true;            for(int j = 2 ; j <= n ; j++)            {                if(!vis[j] && dis[j] < dis[k] * Graph[k][j])                {                    dis[j] = dis[k]*Graph[k][j];                }            }        }        printf("%.6lf percent\n",dis[n]*100);    }    int main()    {        while(scanf("%d",&n) && n)        {            scanf("%d",&m);            memset(Graph,0,sizeof(Graph));            int a,b,c;            double f;            for(int i = 0 ; i < m ; i++)            {                scanf("%d %d %d",&a,&b,&c);                f = ((double)c)/100;                Graph[a][b] = f;                Graph[b][a] = f;            }            dijkstra();        }        return 0;    }


0 0
原创粉丝点击