fork(1) download
  1. <?php
  2.  
  3. /* http://d...content-available-to-author-only...2.net/ */
  4.  
  5. define('SUBWAY', 'sub');
  6. define('FOOT', 'foot');
  7. define('BUS', 'bus');
  8.  
  9. $transportName = array(
  10. SUBWAY => 'едешь на метро',
  11. FOOT => 'идешь пешком',
  12. BUS => 'едешь на автобусе'
  13. );
  14.  
  15. $startPoint = 'kre'; // Петроградская
  16. $endPoint = 'nov'; // Новая Голландия
  17.  
  18. $pointNames = array(
  19. 'pet' => 'ст. м. Петроградская',
  20. 'chk' => 'ст. м. Чкаловская',
  21. 'gor' => 'ст. м. Горьковская',
  22. 'spo' => 'ст. м. Спортивная',
  23. 'vas' => 'ст. м. Василеостровская',
  24. 'kre' => 'Петропавловская крепость',
  25. 'let' => 'Летний сад',
  26. 'dvo' => 'Дворцовая площадь',
  27. 'isa' => 'Исакиевский собор',
  28. 'nov' => 'Новая Голландия',
  29. 'ras' => 'Дом Раскольникова',
  30. 'gos' => 'Гостиный Двор',
  31. 'sen' => 'Сенная Площадь',
  32. 'vla' => 'ст. м. Владимирская',
  33. 'vit' => 'Витебский вокзал',
  34. 'teh' => 'Технологический Институт'
  35. );
  36.  
  37. $paths = array(
  38.  
  39. 'pet' => array(
  40. 'chk' => canGet(10, BUS),
  41. 'gor' => canGet(3, SUBWAY)
  42. ),
  43.  
  44. 'chk' => array(
  45. 'pet' => canGet(10, BUS),
  46. 'spo' => canGet(3, SUBWAY)
  47. ),
  48.  
  49. 'gor' => array(
  50. 'pet' => canGet(3, SUBWAY),
  51. 'kre' => canGet(5, FOOT),
  52. 'gos' => canGet(6, SUBWAY)
  53. ),
  54.  
  55. 'spo' => array(
  56. 'chk' => canGet(3, SUBWAY),
  57. 'vas' => canGet(10, BUS),
  58. 'sen' => canGet(7, SUBWAY)
  59. ),
  60.  
  61. 'vas' => array(
  62. 'spo' => canGet(10, BUS),
  63. 'gos' => canGet(7, SUBWAY),
  64. 'nov' => canGet(11, FOOT)
  65. ),
  66.  
  67. 'kre' => array(
  68. 'gor' => canGet(5, FOOT)
  69. ),
  70.  
  71. 'let' => array(
  72. 'dvo' => canGet(6, FOOT),
  73. 'gos' => canGet(7, FOOT)
  74. ),
  75.  
  76. 'dvo' => array(
  77. 'isa' => canGet(6, FOOT),
  78. 'gos' => canGet(6, FOOT),
  79. 'let' => canGet(6, FOOT)
  80. ),
  81.  
  82. 'isa' => array(
  83. 'dvo' => canGet(6, FOOT),
  84. 'nov' => canGet(5, FOOT)
  85. ),
  86.  
  87. 'nov' => array(
  88. 'vas' => canGet(11, FOOT),
  89. 'isa' => canGet(5, FOOT),
  90. 'ras' => canGet(7, BUS)
  91. ),
  92.  
  93. 'ras' => array(
  94. 'nov' => canGet(7, BUS),
  95. 'sen' => canGet(3, FOOT)
  96. ),
  97.  
  98. 'gos' => array(
  99. 'vas' => canGet(7, SUBWAY),
  100. 'sen' => canGet(3, SUBWAY),
  101. 'dvo' => canGet(6, FOOT),
  102. 'gor' => canGet(6, SUBWAY),
  103. 'let' => canGet(7, FOOT),
  104. 'vla' => canGet(7, FOOT)
  105. ),
  106.  
  107. 'sen' => array(
  108. 'ras' => canGet(3, FOOT),
  109. 'spo' => canGet(7, SUBWAY),
  110. 'gos' => canGet(3, SUBWAY),
  111. 'vla' => canGet(4, SUBWAY),
  112. 'vit' => canGet(2, SUBWAY),
  113. 'teh' => canGet(3, SUBWAY)
  114. ),
  115.  
  116. 'vla' => array(
  117. 'sen' => canGet(4, SUBWAY),
  118. 'gos' => canGet(7, FOOT),
  119. 'vit' => canGet(3, SUBWAY)
  120. ),
  121.  
  122. 'vit' => array(
  123. 'sen' => canGet(2, SUBWAY),
  124. 'teh' => canGet(2, SUBWAY),
  125. 'vla' => canGet(3, SUBWAY)
  126. ),
  127.  
  128. 'teh' => array(
  129. 'sen' => canGet(3, SUBWAY),
  130. 'vit' => canGet(2, SUBWAY)
  131. )
  132. );
  133.  
  134. /* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.
  135. «canGet» переводится как «можно попасть» */
  136. function canGet($time, $byWhat)
  137. {
  138. return array(
  139. 'time' => $time,
  140. 'by' => $byWhat
  141. );
  142. }
  143.  
  144. /*заполняем массив, который будет содержать метки для каждой из вершин а также
  145. массив, в котором ведем учет уже проверенных вершин и массив, в который сохраняем отрезки пути */
  146.  
  147. $unChecked = array();
  148. $marks = array();
  149. $roads = array();
  150.  
  151. foreach ($paths as $point => $details) {
  152. static $i = 999;
  153. if ($point == $startPoint) {
  154. $marks[$point] = 0;
  155. $roads[$point] = "Из {$pointNames[$point]}";
  156. } else {
  157. $marks[$point] = $i++;
  158. }
  159. $unChecked[$point] = $marks[$point];
  160. }
  161.  
  162. //echo "Starting from $startPoint... Destination : {$endPoint}\n";
  163.  
  164. while (!empty($unChecked)) {
  165. $unCheckedR = array_flip($unChecked);
  166. $min = min(array_keys($unCheckedR));
  167. $curr = $unCheckedR[$min];
  168. // echo "Now curr is {$curr}\n";
  169. unset($unChecked[$curr]);
  170. $neighbours = $paths[$curr];
  171.  
  172. // echo "Neighbours are: ";
  173. // var_dump($neighbours);
  174. // echo "\n";
  175.  
  176. foreach ($neighbours as $station => $details) {
  177. // echo "Starting cicle...\n";
  178. // echo "neighbour is {$station}\n";
  179. // echo "it's mark is {$marks[$station]}, curr's mark is {$marks[$curr]} (expecting 0).\n";
  180. if (($details["time"] + $marks[$curr]) <= $marks[$station]) {
  181. // echo "TRUE!\n";
  182. $unChecked[$station] = $marks[$station] = $details["time"] + $marks[$curr];
  183. // echo "time is {$details['time']}, {$station}\'s new mark is {$marks[$station]}.\n";
  184. $transport = $details["by"];
  185.  
  186. $roads[$station] = "{$roads[$curr]} {$transportName[$transport]} до {$pointNames[$station]} - {$details['time']} минут.\n";
  187. $roads[$station] .= ($station == $endPoint) ? "В итоге ты попадаешь в точку {$pointNames[$station]} за {$marks[$station]} минут.\n" : "Из неё";
  188. }
  189. // echo "now endPoint's mark is {$marks[$endPoint]}, endPoint's road is {$roads[$endPoint]}.\n";
  190. }
  191. // print_r($unChecked);
  192. //var_dump($roads[$endPoint]);
  193. // echo "deleting curr...\n";
  194. }
  195.  
  196. echo $roads[$endPoint];
  197.  
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
Из Петропавловская крепость идешь пешком до ст. м. Горьковская - 5 минут.
Из неё едешь на метро до Гостиный Двор - 6 минут.
Из неё едешь на метро до Сенная Площадь - 3 минут.
Из неё идешь пешком до Дом Раскольникова - 3 минут.
Из неё едешь на автобусе до Новая Голландия - 7 минут.
В итоге ты попадаешь в точку Новая Голландия за 24 минут.