<?php
/* http://d...content-available-to-author-only...2.net/ */
SUBWAY => 'едешь на метро' ,
FOOT => 'идешь пешком' ,
BUS => 'едешь на автобусе'
) ;
$startPoint = 'kre' ; // Петроградская
$endPoint = 'nov' ; // Новая Голландия
'pet' => 'ст. м. Петроградская' ,
'chk' => 'ст. м. Чкаловская' ,
'gor' => 'ст. м. Горьковская' ,
'spo' => 'ст. м. Спортивная' ,
'vas' => 'ст. м. Василеостровская' ,
'kre' => 'Петропавловская крепость' ,
'let' => 'Летний сад' ,
'dvo' => 'Дворцовая площадь' ,
'isa' => 'Исакиевский собор' ,
'nov' => 'Новая Голландия' ,
'ras' => 'Дом Раскольникова' ,
'gos' => 'Гостиный Двор' ,
'sen' => 'Сенная Площадь' ,
'vla' => 'ст. м. Владимирская' ,
'vit' => 'Витебский вокзал' ,
'teh' => 'Технологический Институт'
) ;
'chk' => canGet( 10 , BUS) ,
'gor' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 10 , BUS) ,
'spo' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 3 , SUBWAY) ,
'kre' => canGet( 5 , FOOT) ,
'gos' => canGet( 6 , SUBWAY)
) ,
'chk' => canGet( 3 , SUBWAY) ,
'vas' => canGet( 10 , BUS) ,
'sen' => canGet( 7 , SUBWAY)
) ,
'spo' => canGet( 10 , BUS) ,
'gos' => canGet( 7 , SUBWAY) ,
'nov' => canGet( 11 , FOOT)
) ,
'gor' => canGet( 5 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'gos' => canGet( 7 , FOOT)
) ,
'isa' => canGet( 6 , FOOT) ,
'gos' => canGet( 6 , FOOT) ,
'let' => canGet( 6 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'nov' => canGet( 5 , FOOT)
) ,
'vas' => canGet( 11 , FOOT) ,
'isa' => canGet( 5 , FOOT) ,
'ras' => canGet( 7 , BUS)
) ,
'nov' => canGet( 7 , BUS) ,
'sen' => canGet( 3 , FOOT)
) ,
'vas' => canGet( 7 , SUBWAY) ,
'sen' => canGet( 3 , SUBWAY) ,
'dvo' => canGet( 6 , FOOT) ,
'gor' => canGet( 6 , SUBWAY) ,
'let' => canGet( 7 , FOOT) ,
'vla' => canGet( 7 , FOOT)
) ,
'ras' => canGet( 3 , FOOT) ,
'spo' => canGet( 7 , SUBWAY) ,
'gos' => canGet( 3 , SUBWAY) ,
'vla' => canGet( 4 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 4 , SUBWAY) ,
'gos' => canGet( 7 , FOOT) ,
'vit' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 2 , SUBWAY) ,
'vla' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 3 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY)
)
) ;
/* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.
«canGet» переводится как «можно попасть» */
function canGet( $time , $byWhat )
{
'time' => $time ,
'by' => $byWhat
) ;
}
/*заполняем массив, который будет содержать метки для каждой из вершин а также
массив, в котором ведем учет уже проверенных вершин и массив, в который сохраняем отрезки пути */
foreach ( $paths as $point => $details ) {
static $i = 999 ;
if ( $point == $startPoint ) {
$marks [ $point ] = 0 ;
$roads [ $point ] = "Из {$pointNames [$point ]}" ;
} else {
$marks [ $point ] = $i ++;
}
$unChecked [ $point ] = $marks [ $point ] ;
}
//echo "Starting from $startPoint... Destination : {$endPoint}\n";
while ( ! empty ( $unChecked ) ) { $curr = $unCheckedR [ $min ] ;
// echo "Now curr is {$curr}\n";
unset ( $unChecked [ $curr ] ) ; $neighbours = $paths [ $curr ] ;
// echo "Neighbours are: ";
// var_dump($neighbours);
// echo "\n";
foreach ( $neighbours as $station => $details ) {
// echo "Starting cicle...\n";
// echo "neighbour is {$station}\n";
// echo "it's mark is {$marks[$station]}, curr's mark is {$marks[$curr]} (expecting 0).\n";
if ( ( $details [ "time" ] + $marks [ $curr ] ) <= $marks [ $station ] ) {
// echo "TRUE!\n";
$unChecked [ $station ] = $marks [ $station ] = $details [ "time" ] + $marks [ $curr ] ;
// echo "time is {$details['time']}, {$station}\'s new mark is {$marks[$station]}.\n";
$transport = $details [ "by" ] ;
$roads [ $station ] = "{$roads [$curr ]} {$transportName [$transport ]} до {$pointNames [$station ]} - {$details['time']} минут.\n " ;
$roads [ $station ] .= ( $station == $endPoint ) ? "В итоге ты попадаешь в точку {$pointNames [$station ]} за {$marks [$station ]} минут.\n " : "Из неё" ;
}
// echo "now endPoint's mark is {$marks[$endPoint]}, endPoint's road is {$roads[$endPoint]}.\n";
}
// print_r($unChecked);
//var_dump($roads[$endPoint]);
// echo "deleting curr...\n";
}
echo $roads [ $endPoint ] ;
PD9waHAKCmVycm9yX3JlcG9ydGluZygtMSk7Ci8qIGh0dHA6Ly9kLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi4yLm5ldC8gKi8KbWJfaW50ZXJuYWxfZW5jb2RpbmcoInV0Zi04Iik7CgpkZWZpbmUoJ1NVQldBWScsICdzdWInKTsKZGVmaW5lKCdGT09UJywgJ2Zvb3QnKTsKZGVmaW5lKCdCVVMnLCAnYnVzJyk7CgokdHJhbnNwb3J0TmFtZSA9IGFycmF5KAogICAgU1VCV0FZID0+ICfQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCiAgICBGT09UID0+ICfQuNC00LXRiNGMINC/0LXRiNC60L7QvCcsCiAgICBCVVMgPT4gJ9C10LTQtdGI0Ywg0L3QsCDQsNCy0YLQvtCx0YPRgdC1JwopOwoKJHN0YXJ0UG9pbnQgPSAna3JlJzsgLy8g0J/QtdGC0YDQvtCz0YDQsNC00YHQutCw0Y8KJGVuZFBvaW50ICAgPSAnbm92JzsgLy8g0J3QvtCy0LDRjyDQk9C+0LvQu9Cw0L3QtNC40Y8KCiRwb2ludE5hbWVzID0gYXJyYXkoCiAgICAncGV0JyA9PiAn0YHRgi4g0LwuINCf0LXRgtGA0L7Qs9GA0LDQtNGB0LrQsNGPJywKICAgICdjaGsnID0+ICfRgdGCLiDQvC4g0KfQutCw0LvQvtCy0YHQutCw0Y8nLAogICAgJ2dvcicgPT4gJ9GB0YIuINC8LiDQk9C+0YDRjNC60L7QstGB0LrQsNGPJywKICAgICdzcG8nID0+ICfRgdGCLiDQvC4g0KHQv9C+0YDRgtC40LLQvdCw0Y8nLAogICAgJ3ZhcycgPT4gJ9GB0YIuINC8LiDQktCw0YHQuNC70LXQvtGB0YLRgNC+0LLRgdC60LDRjycsCiAgICAna3JlJyA9PiAn0J/QtdGC0YDQvtC/0LDQstC70L7QstGB0LrQsNGPINC60YDQtdC/0L7RgdGC0YwnLAogICAgJ2xldCcgPT4gJ9Cb0LXRgtC90LjQuSDRgdCw0LQnLAogICAgJ2R2bycgPT4gJ9CU0LLQvtGA0YbQvtCy0LDRjyDQv9C70L7RidCw0LTRjCcsCiAgICAnaXNhJyA9PiAn0JjRgdCw0LrQuNC10LLRgdC60LjQuSDRgdC+0LHQvtGAJywKICAgICdub3YnID0+ICfQndC+0LLQsNGPINCT0L7Qu9C70LDQvdC00LjRjycsCiAgICAncmFzJyA9PiAn0JTQvtC8INCg0LDRgdC60L7Qu9GM0L3QuNC60L7QstCwJywKICAgICdnb3MnID0+ICfQk9C+0YHRgtC40L3Ri9C5INCU0LLQvtGAJywKICAgICdzZW4nID0+ICfQodC10L3QvdCw0Y8g0J/Qu9C+0YnQsNC00YwnLAogICAgJ3ZsYScgPT4gJ9GB0YIuINC8LiDQktC70LDQtNC40LzQuNGA0YHQutCw0Y8nLAogICAgJ3ZpdCcgPT4gJ9CS0LjRgtC10LHRgdC60LjQuSDQstC+0LrQt9Cw0LsnLAogICAgJ3RlaCcgPT4gJ9Ci0LXRhdC90L7Qu9C+0LPQuNGH0LXRgdC60LjQuSDQmNC90YHRgtC40YLRg9GCJwopOwoKJHBhdGhzID0gYXJyYXkoCiAgICAKICAgICdwZXQnID0+IGFycmF5KAogICAgICAgICdjaGsnID0+IGNhbkdldCgxMCwgQlVTKSwKICAgICAgICAnZ29yJyA9PiBjYW5HZXQoMywgU1VCV0FZKQogICAgKSwKICAgIAogICAgJ2NoaycgPT4gYXJyYXkoCiAgICAgICAgJ3BldCcgPT4gY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdzcG8nID0+IGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAogICAgCiAgICAnZ29yJyA9PiBhcnJheSgKICAgICAgICAncGV0JyA9PiBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAna3JlJyA9PiBjYW5HZXQoNSwgRk9PVCksCiAgICAgICAgJ2dvcycgPT4gY2FuR2V0KDYsIFNVQldBWSkKICAgICksCiAgICAKICAgICdzcG8nID0+IGFycmF5KAogICAgICAgICdjaGsnID0+IGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICd2YXMnID0+IGNhbkdldCgxMCwgQlVTKSwKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoNywgU1VCV0FZKQogICAgKSwKICAgIAogICAgJ3ZhcycgPT4gYXJyYXkoCiAgICAgICAgJ3NwbycgPT4gY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdub3YnID0+IGNhbkdldCgxMSwgRk9PVCkKICAgICksCiAgICAKICAgICdrcmUnID0+IGFycmF5KAogICAgICAgICdnb3InID0+IGNhbkdldCg1LCBGT09UKQogICAgKSwKICAgIAogICAgJ2xldCcgPT4gYXJyYXkoCiAgICAgICAgJ2R2bycgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBGT09UKQogICAgKSwKICAgIAogICAgJ2R2bycgPT4gYXJyYXkoCiAgICAgICAgJ2lzYScgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnbGV0JyA9PiBjYW5HZXQoNiwgRk9PVCkKICAgICksCiAgICAKICAgICdpc2EnID0+IGFycmF5KAogICAgICAgICdkdm8nID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnbm92JyA9PiBjYW5HZXQoNSwgRk9PVCkKICAgICksCiAgICAKICAgICdub3YnID0+IGFycmF5KAogICAgICAgICd2YXMnID0+IGNhbkdldCgxMSwgRk9PVCksCiAgICAgICAgJ2lzYScgPT4gY2FuR2V0KDUsIEZPT1QpLAogICAgICAgICdyYXMnID0+IGNhbkdldCg3LCBCVVMpCiAgICApLAogICAgCiAgICAncmFzJyA9PiBhcnJheSgKICAgICAgICAnbm92JyA9PiBjYW5HZXQoNywgQlVTKSwKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMywgRk9PVCkKICAgICksCiAgICAKICAgICdnb3MnID0+IGFycmF5KAogICAgICAgICd2YXMnID0+IGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdzZW4nID0+IGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICdkdm8nID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnZ29yJyA9PiBjYW5HZXQoNiwgU1VCV0FZKSwKICAgICAgICAnbGV0JyA9PiBjYW5HZXQoNywgRk9PVCksCiAgICAgICAgJ3ZsYScgPT4gY2FuR2V0KDcsIEZPT1QpCiAgICApLAogICAgCiAgICAnc2VuJyA9PiBhcnJheSgKICAgICAgICAncmFzJyA9PiBjYW5HZXQoMywgRk9PVCksCiAgICAgICAgJ3NwbycgPT4gY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgJ2dvcycgPT4gY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgJ3ZsYScgPT4gY2FuR2V0KDQsIFNVQldBWSksCiAgICAgICAgJ3ZpdCcgPT4gY2FuR2V0KDIsIFNVQldBWSksCiAgICAgICAgJ3RlaCcgPT4gY2FuR2V0KDMsIFNVQldBWSkKICAgICksCiAgICAKICAgICd2bGEnID0+IGFycmF5KAogICAgICAgICdzZW4nID0+IGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBGT09UKSwKICAgICAgICAndml0JyA9PiBjYW5HZXQoMywgU1VCV0FZKQogICAgKSwKICAgIAogICAgJ3ZpdCcgPT4gYXJyYXkoCiAgICAgICAgJ3NlbicgPT4gY2FuR2V0KDIsIFNVQldBWSksCiAgICAgICAgJ3RlaCcgPT4gY2FuR2V0KDIsIFNVQldBWSksCiAgICAgICAgJ3ZsYScgPT4gY2FuR2V0KDMsIFNVQldBWSkKICAgICksCiAgICAKICAgICd0ZWgnID0+IGFycmF5KAogICAgICAgICdzZW4nID0+IGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICd2aXQnID0+IGNhbkdldCgyLCBTVUJXQVkpCiAgICApCik7CgovKiDQp9GC0L7QsdGLINC90LUg0L/QuNGB0LDRgtGMINC80L3QvtCz0L4g0YDQsNC3IGFycmF5KCd0aW1lJyA9PiAuLi4sICdieScgPT4gLi4uKSwg0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0YTRg9C90LrRhtC40Y4uCsKrY2FuR2V0wrsg0L/QtdGA0LXQstC+0LTQuNGC0YHRjyDQutCw0LogwqvQvNC+0LbQvdC+INC/0L7Qv9Cw0YHRgtGMwrsgKi8KZnVuY3Rpb24gY2FuR2V0KCR0aW1lLCAkYnlXaGF0KQp7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ3RpbWUnID0+ICR0aW1lLAogICAgICAgICdieScgPT4gJGJ5V2hhdAogICAgKTsKfQoKLyrQt9Cw0L/QvtC70L3Rj9C10Lwg0LzQsNGB0YHQuNCyLCDQutC+0YLQvtGA0YvQuSDQsdGD0LTQtdGCINGB0L7QtNC10YDQttCw0YLRjCDQvNC10YLQutC4INC00LvRjyDQutCw0LbQtNC+0Lkg0LjQtyDQstC10YDRiNC40L0g0LAg0YLQsNC60LbQtQrQvNCw0YHRgdC40LIsINCyINC60L7RgtC+0YDQvtC8INCy0LXQtNC10Lwg0YPRh9C10YIg0YPQttC1INC/0YDQvtCy0LXRgNC10L3QvdGL0YUg0LLQtdGA0YjQuNC9INC4INC80LDRgdGB0LjQsiwg0LIg0LrQvtGC0L7RgNGL0Lkg0YHQvtGF0YDQsNC90Y/QtdC8INC+0YLRgNC10LfQutC4INC/0YPRgtC4ICovCgokdW5DaGVja2VkID0gYXJyYXkoKTsKJG1hcmtzICAgICA9IGFycmF5KCk7CiRyb2FkcyAgICAgPSBhcnJheSgpOwoKZm9yZWFjaCAoJHBhdGhzIGFzICRwb2ludCA9PiAkZGV0YWlscykgewogICAgc3RhdGljICRpID0gOTk5OwogICAgaWYgKCRwb2ludCA9PSAkc3RhcnRQb2ludCkgewogICAgICAgICRtYXJrc1skcG9pbnRdID0gMDsKICAgICAgICAkcm9hZHNbJHBvaW50XSA9ICLQmNC3IHskcG9pbnROYW1lc1skcG9pbnRdfSI7CiAgICB9IGVsc2UgewogICAgICAgICRtYXJrc1skcG9pbnRdID0gJGkrKzsKICAgIH0KICAgICR1bkNoZWNrZWRbJHBvaW50XSA9ICRtYXJrc1skcG9pbnRdOwp9CgovL2VjaG8gIlN0YXJ0aW5nIGZyb20gJHN0YXJ0UG9pbnQuLi4gRGVzdGluYXRpb24gOiB7JGVuZFBvaW50fVxuIjsKCndoaWxlICghZW1wdHkoJHVuQ2hlY2tlZCkpIHsKICAgICR1bkNoZWNrZWRSID0gYXJyYXlfZmxpcCgkdW5DaGVja2VkKTsKICAgICRtaW4gICAgICAgID0gbWluKGFycmF5X2tleXMoJHVuQ2hlY2tlZFIpKTsKICAgICRjdXJyICAgICAgID0gJHVuQ2hlY2tlZFJbJG1pbl07CiAgLy8gIGVjaG8gIk5vdyBjdXJyIGlzIHskY3Vycn1cbiI7CiAgICB1bnNldCgkdW5DaGVja2VkWyRjdXJyXSk7CiAgICAkbmVpZ2hib3VycyA9ICRwYXRoc1skY3Vycl07CiAgICAKICAvLyAgZWNobyAiTmVpZ2hib3VycyBhcmU6ICI7CiAgIC8vIHZhcl9kdW1wKCRuZWlnaGJvdXJzKTsKICAvLyAgZWNobyAiXG4iOwogICAgCiAgICBmb3JlYWNoICgkbmVpZ2hib3VycyBhcyAkc3RhdGlvbiA9PiAkZGV0YWlscykgewogICAgLy8gIGVjaG8gIlN0YXJ0aW5nIGNpY2xlLi4uXG4iOwogICAgLy8gIGVjaG8gIm5laWdoYm91ciBpcyB7JHN0YXRpb259XG4iOwogICAgICAvLyAgZWNobyAiaXQncyBtYXJrIGlzIHskbWFya3NbJHN0YXRpb25dfSwgY3VycidzIG1hcmsgaXMgeyRtYXJrc1skY3Vycl19IChleHBlY3RpbmcgMCkuXG4iOwogICAgICAgIGlmICgoJGRldGFpbHNbInRpbWUiXSArICRtYXJrc1skY3Vycl0pIDw9ICRtYXJrc1skc3RhdGlvbl0pIHsKICAgICAgICAvLyAgZWNobyAiVFJVRSFcbiI7CiAgICAgICAgICAgICR1bkNoZWNrZWRbJHN0YXRpb25dID0gJG1hcmtzWyRzdGF0aW9uXSA9ICRkZXRhaWxzWyJ0aW1lIl0gKyAkbWFya3NbJGN1cnJdOwogICAgICAgICAvLyAgZWNobyAidGltZSBpcyB7JGRldGFpbHNbJ3RpbWUnXX0sIHskc3RhdGlvbn1cJ3MgbmV3IG1hcmsgaXMgeyRtYXJrc1skc3RhdGlvbl19LlxuIjsKICAgICAgICAgICAgJHRyYW5zcG9ydCAgICAgICA9ICRkZXRhaWxzWyJieSJdOwogICAgICAgICAgICAKICAgICAgICAgICAgJHJvYWRzWyRzdGF0aW9uXSA9ICJ7JHJvYWRzWyRjdXJyXX0geyR0cmFuc3BvcnROYW1lWyR0cmFuc3BvcnRdfSDQtNC+IHskcG9pbnROYW1lc1skc3RhdGlvbl19IC0geyRkZXRhaWxzWyd0aW1lJ119INC80LjQvdGD0YIuXG4iOwogICAgICAgICAgICAkcm9hZHNbJHN0YXRpb25dIC49ICgkc3RhdGlvbiA9PSAkZW5kUG9pbnQpID8gItCSINC40YLQvtCz0LUg0YLRiyDQv9C+0L/QsNC00LDQtdGI0Ywg0LIg0YLQvtGH0LrRgyB7JHBvaW50TmFtZXNbJHN0YXRpb25dfSDQt9CwIHskbWFya3NbJHN0YXRpb25dfSDQvNC40L3Rg9GCLlxuIiA6ICLQmNC3INC90LXRkSI7CiAgICAgICAgfQogICAgIC8vIGVjaG8gIm5vdyBlbmRQb2ludCdzIG1hcmsgaXMgeyRtYXJrc1skZW5kUG9pbnRdfSwgZW5kUG9pbnQncyByb2FkIGlzIHskcm9hZHNbJGVuZFBvaW50XX0uXG4iOwogICAgfQogICAvLyBwcmludF9yKCR1bkNoZWNrZWQpOwogICAvL3Zhcl9kdW1wKCRyb2Fkc1skZW5kUG9pbnRdKTsKICAvLyBlY2hvICJkZWxldGluZyBjdXJyLi4uXG4iOwp9CgplY2hvICRyb2Fkc1skZW5kUG9pbnRdOwo=