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 ; }