POJ 2502 SUBWAY(最短)

                                                                     POJ 2502 SUBWAY

トピックへのリンク:http://poj.org/problem?id=2502

タイトル効果:最短必要な点Aから点Bへのシーク時間。

トピックのアイデア:、必要な距離として考え、各ポイント間の時間をほとんど短絡を追求します。それから

最も短絡用Dijと、それは、小さなピット入力を感じ、だけでなく、各地下鉄線、唯一同じ地下鉄線内

ポイントは、相互に到達することができます。

書式#include <stdio.hに> 
する#include <アルゴリズム> 
書式#include <math.h>の
 使用して 名前空間はstdを、
CONST  INT MAXN = 310 const  int型 INF = 1E9;
構造体NOD 
{ 
    ダブルX、Y。
}ノード[MAXN]。
二重のコストは[MAXN] [MAXN]、[MAXN] DIS;
BOOL VIS [MAXN]。
ボイドをDij(整数 nは、int型U)を
{ 
    ためint型 I = 2 ; iが<= N; iが++ 
    { 
        DIS [I] =  INF。
    }
    int型開始= U; 
    VIS [ 1 ] = 1 以下のためにint型 i = 1 ; iが<= N; iが++ 
        { 
          DIS [I] =(コスト[開始] [I] <= DIS [I])?コスト[i]の[スタート]:DIS [i]は、    
        }   
    // のprintf( "%d個の\ n"、開始)。
    以下のためにint型 I = 1 ; I <= N- 1、I ++ 
    { // 找到理起始点最近的点
     INT分= 9999999 int型 iは= 1 iが<= N; iが++ 
     {

                     もし(MIN> = DIS [I] && VIS [I] == 0 
            {  = DIS [i]は、
                 開始 = I; 
            }     
     } 
     VIS [スタート] = 1 
           
            以下のためにint型 i = 1 ; iは= N <; iは++ 
    { 
        場合(!VIS [I] = 1 
        DIS [i]は =(DIS [i]は<=(DIS [開始] +コスト[開始] [I] ?))DIS [i]は:( DIS [スタート] + コスト[スタート] [i])と、
    } 
    } 

} 
ダブルDIST(NOD Aを、NOD b)は
{ 
    リターンSQRT((AX-BX)*(AX-BX)+(AY-によって)*(ay- )によります)。
} 
int型のmain()
{ 
    ダブル V1 = 10000.0 / 60 ダブル V2 = 40000.0 / 60 ; 
    scanf関数(" %LF%LF%LF%LF "、およびノード[ 1 ] .X、およびノード[ 1 ]・Y、およびノード[ 2 ] .X、およびノード[ 2 ]・Y)
    INT、N = 2 int型 CNT1 = 3 ;
    以下のためにint型私= 1 ; iが= < 300 ; I ++
    { 
        ためのint型 J = 1 ; J <= 300 ; J ++ 
        { 
            場合(I == j)のコスト[I] [J] = 0 ;
            他のコスト[I] [J] = infファイル。
        } 
    } 
    ダブルX、Y。
    一方、(scanf関数(" %のLFの%のLF "、およびX&Y))
    { 
        もし、( - X == 1 &&のy == - 1 
        { 
            CNT1 = N + 1 破ります; 
        } 
        のn ++; 
        ノード[N] .X =のXと、
        ノード[N]・Y = Y。
        もし(N!= CNT1)コスト[n]が[N- 1 ] =コスト[N- 1 ] [N] =分(コスト[n]が[N- 1 ]、DIST(ノード[n]は、ノード[N- 1 ])/ V2)。
    } 
    一方(scanf関数(" %のLFの%のLF "、およびX&Y)=!EOF)
    { 
        N ++ 
        ノード[N] .X =のXと、
        ノード[N]・Y = Y。
        一方、(scanf関数(" %のLFの%のLF "、およびX&Y)!= EOF)
        {
            もし(x == - 1 &&のy == - 1ブレーク
                N ++ ; 
                ノード[N] .X =のXと、
                ノード[N]・Y = Y。
        } 
        であれば(N!= CNT1)コスト[n]が[N- 1 ] =コスト[N- 1 [N] [N] =分(コスト[N- 1 ]、DIST(ノード[n]は、nはノード[ - 1 ])/ V2)。
    } 
    のためのint型 i = 1 ; iが<= N iが++ 
    { 
        ためINT J = 1 J ++; J <= N 
        {
            コスト[I] [J] =分(コスト[I] [j]は、DIST(ノード[i]は、ノード[J])/ V1)。
        } 
    } 
    をDij(N、1 )。
    printf(" %d個の\ n "、(INT)(DIS [ 2 ] + 0.5 ))。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/tombraider-shadow/p/11184054.html