zoukankan      html  css  js  c++  java
  • 杭电1596 find the safest road

    find the safest road

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 6380    Accepted Submission(s): 2271


    Problem Description
    XX星球有非常多城市,每一个城市之间有一条或多条飞行通道,可是并非全部的路都是非常安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包含0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,如今8600 想出去旅游。面对这这么多的路,他想找一条最安全的路。

    可是8600 的数学不好,想请你帮忙 ^_^


    Input
    输入包含多个測试实例。每一个实例包含:
    第一行:n。

    n表示城市的个数n<=1000;
    接着是一个n*n的矩阵表示两个城市之间的安全系数,(0能够理解为那两个城市之间没有直接的通道)
    接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市


    Output
    假设86无法达到他的目的地,输出"What a pity!",
    其它的输出这两个城市之间的最安全道路的安全系数,保留三位小数。

    Sample Input
    3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3

    Sample Output
    0.500
    0.400
    0.500

    这道题是用的floyd做的。也属于最短路中的一种方法

    代码:

    #include<stdio.h>
    #include<string.h>
    #define INF 1 << 30
    double map[1001][1001] ;
    void floyd(int n)
    {
     for(int k = 1 ; k <= n ; k++)
      for(int i = 1 ; i <= n ; i++)
       for(int j = 1 ; j <= n ; j++)
        if(map[i][j] < map[i][k] * map[k][j])
         map[i][j] = map[i][k] * map[k][j] ;
    }
    int main()
    {
     int n = 0 ;
     while(~scanf("%d" , &n) && n )
     {
      int i  = 0 , j = 0 ;
            memset(map , 0 , sizeof( map ) ) ;
      for( i = 1 ; i <= n ; i++)
      {
       for( j = 1 ; j <= n ; j++)
       {
        scanf("%lf",&map[i][j]);
       }
      }
      int Q =  0 ;
      scanf("%d",&Q);
      floyd( n ) ;
      while( Q-- && n)
      {
       int x , y ;
                scanf("%d%d" , &x , &y);
       if(map[x][y])
          printf("%.3lf ", map[x][y]) ;
       else
        printf("What a pity! ") ;
      }
     }
     return 0 ;
    }

  • 相关阅读:
    Git
    Spring
    Linux
    Linux
    Linux
    Linux
    Linux
    Linux
    Linux
    Linux
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7050669.html
Copyright © 2011-2022 走看看