ZOJ 2797 最安全逃芝加哥路径

////////////////////////////////////////////////////////////
//最安全逃芝加哥路径
//用单源最短路径法
//在本题中的prev[]没有用到,这是用于构造最短路径的,本题不需要
#include<iostream>
#include<iomanip>
using namespace std;
#define MIN 0.0
double c[105][105];
int prev[105];
double dist[105];

 

 

void build(int m)
{
    int i,a,b,cost;
    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>cost;
        c[a][b]=c[b][a]=double(cost)/100;
    }
}

 

void Dijk(int n,int v)
{
    int i,j,k;
    double tempmax;
    for(i=1;i<=n;i++)            //初始化
    {
        dist[i]=c[v][i];
        if(dist[i]==MIN) prev[i]=0;
        else prev[i]=v;
    }
    c[v][v]=1.0;
    dist[v]=1.0;
    for(i=1;i<n;i++)
    {
        tempmax=0.0;
        for(k=1;k<=n;k++)
            if(c[k][k]!=1.0 && tempmax<dist[k])   //找出最大的概率
            {
                tempmax=dist[k];
                j=k;
            }
        c[j][j]=1.0;
        for(k=1;k<=n;k++)
        {
            if(c[k][k]!=1.0 && c[j][k]!=MIN)      //修改dist的值
                if(dist[k]<dist[j]*c[j][k])
                {
                    dist[k]=dist[j]*c[j][k];
                    prev[k]=j;
                }
        }
    }
}


int main()
{
    int i,j,n,m;
    while(cin>>n && n!=0)
    {
        cin>>m;
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
                c[i][j]=MIN;
        for(i=0;i<=n;i++)
            c[i][i]=0;
        build(m);
        Dijk(n,1);

        cout<<setiosflags(ios::fixed)<<setprecision(6)<<dist[n]*100<<" percent"<<endl;
    }
    return 0;
}

 

你可能感兴趣的:(ZOJ)