zoj - 2797 - 106 miles to Chicago

题意:有n地点,从一个地点到另一个地点有被抓的可能性,问从地点1到地点n不被抓的可能性最大是多少。

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1797

——>>Dijkstra算法题目,题目是那么的简单,直接用Dijkstra算法一上即可(注间边界设置:地点自己到自己不被抓的可能性为100%,到其他没边的地点被抓的可能性为0(就是一定被抓)),却不想中间用来比较的浮点型变量m设为了整型——千里之堤,溃于蚁穴!!!

#include <iostream>
#include <string.h>
#include <iomanip>

using namespace std;

const int maxn = 100 + 10;      //最多有99个点,开110的大小

double G[maxn][maxn];       //用邻接矩阵保存权值

int main()
{
    int n, m, i, j, v1, v2;        //v1,v2,pro为输入的中间变量
    double pro;
    while(cin>>n)
    {
        if(n == 0) return 0;
        cin>>m;
        memset(G, 0, sizeof(G));
        for(i = 1; i <= m; i++)     //存储邻接矩阵
        {
            cin>>v1>>v2>>pro;
            G[v1][v2] = pro;
            G[v2][v1] = pro;
        }
        for(i = 1; i <= n; i++) G[i][i] = 100;
        bool v[maxn];       //判断点是否走过
        memset(v, 0, sizeof(v));        //初始化为0
        double d[maxn];     //d[i]表示从结点1开始,到结点i的最大不被抓百分率
        for(i = 1; i <= n; i++)
            d[i] = G[1][i];         //初始化
        d[1] = 1;       //起始点标为已走
        for(i = 0; i < n-1; i++)        //n个点,起始点标记,还需标记n-1个点
        {
            int x;
            double m = 0;       //小心!!!这个别定义为了整型!!!
            for(j = 1; j <= n; j++)     //求从结点1出发的最大不被抓百分率,保存为m,下标为x
                if(!v[j] && d[j] >= m)
                    m = d[x=j];
            v[x] = 1;       //标记为走过(每次都一定会找到一个点,不用判断是否找得到)
            for(j = 1; j <= n; j++)     //修改其他点的最大不被抓百分率
                d[j] = (d[j] > d[x]*G[x][j]/100.0 ? d[j] : d[x]*G[x][j]/100.0);
        }
        cout<<setiosflags(ios::fixed)<<setprecision(6)<<d[n]<<" percent"<<endl;
    }
    return 0;
}


你可能感兴趣的:(zoj - 2797 - 106 miles to Chicago)