fork(1) download
  1. <?php
  2.  
  3. /* http://d...content-available-to-author-only...2.net/ */
  4.  
  5. define('SUBWAY', "едешь на метро");
  6. define('FOOT', "идешь пешком");
  7. define('BUS', "едешь на автобусе");
  8.  
  9. /*Функция построения кратчайшего пути.
  10. Возвращает NULL, если кратчайший путь не содержит промежуточных нодов.
  11. Иначе, возвращает массив промежуточных нодов.
  12. */
  13. function getPath($start, $end, $interimStep){
  14. if ($interimStep[$start][$end] == INF) {
  15. return NULL;
  16. }
  17. $shortestPath = array();
  18. $temp = $end;
  19. while ($temp != INF) {
  20. $temp = $interimStep[$start][$temp];
  21. array_unshift($shortestPath, $temp);
  22. }
  23. unset($shortestPath[0]);
  24. return $shortestPath;
  25. }
  26.  
  27. /*Функция вывода пути.
  28. */
  29. function printPath($startPoint, $endPoint, $shortestPath, $paths, $pointNames){
  30.  
  31. $pathTransport = array(
  32. 0 => array(
  33. 1 => BUS,
  34. 2 => SUBWAY
  35. ),
  36.  
  37. 1 => array(
  38. 0 => BUS,
  39. 3 => SUBWAY
  40. ),
  41.  
  42. 2 => array(
  43. 0 => BUS,
  44. 5 => FOOT,
  45. 11 => SUBWAY
  46. ),
  47.  
  48. 3 => array(
  49. 1 => SUBWAY,
  50. 4 => BUS,
  51. 12 => SUBWAY
  52. ),
  53.  
  54. 4 => array(
  55. 3 => BUS,
  56. 11 => SUBWAY,
  57. 9 => FOOT
  58. ),
  59.  
  60. 5 => array(
  61. 2 => FOOT
  62. ),
  63.  
  64. 6 => array(
  65. 7 => FOOT,
  66. 11 => FOOT
  67. ),
  68.  
  69. 7 => array(
  70. 8 => FOOT,
  71. 11 => FOOT,
  72. 6 => FOOT
  73. ),
  74.  
  75. 8 => array(
  76. 7 => FOOT,
  77. 9 => FOOT
  78. ),
  79.  
  80. 9 => array(
  81. 4 => FOOT,
  82. 8 => FOOT,
  83. 10 => BUS
  84. ),
  85.  
  86. 10 => array(
  87. 9 => BUS,
  88. 12 => FOOT
  89. ),
  90.  
  91. 11 => array(
  92. 4 => SUBWAY,
  93. 12 => SUBWAY,
  94. 7 => FOOT,
  95. 2 => SUBWAY,
  96. 6 => FOOT,
  97. 13 => FOOT
  98. ),
  99.  
  100. 12 => array(
  101. 10 => FOOT,
  102. 3 => SUBWAY,
  103. 11 => SUBWAY,
  104. 13 => SUBWAY,
  105. 14 => SUBWAY,
  106. 15 => SUBWAY
  107. ),
  108.  
  109. 13 => array(
  110. 12 => SUBWAY,
  111. 11 => FOOT,
  112. 14 => SUBWAY
  113. ),
  114.  
  115. 14 => array(
  116. 12 => SUBWAY,
  117. 15 => SUBWAY,
  118. 13 => SUBWAY
  119. ),
  120.  
  121. 15 => array(
  122. 12 => SUBWAY,
  123. 14 => SUBWAY
  124. )
  125. );
  126. echo "Начальная точка: \"{$pointNames[$startPoint]}\"\n";
  127. $temp = $startPoint;
  128. if ($shortestPath != NULL) {
  129. $temp = $startPoint;
  130. foreach ($shortestPath as $node) {
  131. echo "Из нее {$pathTransport[$temp][$node]} до точки \"{$pointNames[$node]}\" {$paths[$temp][$node]} мин.\n";
  132. $temp = $node;
  133. }
  134. }
  135. echo "Из нее {$pathTransport[$temp][$endPoint]} до точки \"{$pointNames[$endPoint]}\" {$paths[$temp][$endPoint]} мин.\n";
  136. echo "В итоге ты попадешь в точку \"{$pointNames[$endPoint]}\" за {$paths[$startPoint][$endPoint]} мин. Приятной поездки!\n\n";
  137. }
  138.  
  139. $pointNames = array(
  140. 0 => 'ст. м. Петроградская',
  141. 1 => 'ст. м. Чкаловская',
  142. 2 => 'ст. м. Горьковская',
  143. 3 => 'ст. м. Спортивная',
  144. 4 => 'ст. м. Василеостровская',
  145. 5 => 'Петропавловская крепость',
  146. 6 => 'Летний сад',
  147. 7 => 'Дворцовая площадь',
  148. 8 => 'Исакиевский собор',
  149. 9 => 'Новая Голландия',
  150. 10 => 'Дом Раскольникова',
  151. 11 => 'Гостиный Двор',
  152. 12 => 'Сенная Площадь',
  153. 13 => 'ст. м. Владимирская',
  154. 14 => 'Витебский вокзал',
  155. 15 => 'Технологический Институт'
  156. );
  157.  
  158. $paths = array(
  159. 0 => array(
  160. 1 => 10,
  161. 2 => 3
  162. ),
  163.  
  164. 1 => array(
  165. 0 => 10,
  166. 3 => 3
  167. ),
  168.  
  169. 2 => array(
  170. 0 => 3,
  171. 5 => 5,
  172. 11 => 6
  173. ),
  174.  
  175. 3 => array(
  176. 1 => 3,
  177. 4 => 10,
  178. 12 => 7
  179. ),
  180.  
  181. 4 => array(
  182. 3 => 10,
  183. 11 => 7,
  184. 9 => 11
  185. ),
  186.  
  187. 5 => array(
  188. 2 => 5
  189. ),
  190.  
  191. 6 => array(
  192. 7 => 6,
  193. 11 => 7
  194. ),
  195.  
  196. 7 => array(
  197. 8 => 6,
  198. 11 => 6,
  199. 6 => 6
  200. ),
  201.  
  202. 8 => array(
  203. 7 => 6,
  204. 9 => 5
  205. ),
  206.  
  207. 9 => array(
  208. 4 => 11,
  209. 8 => 5,
  210. 10 => 7
  211. ),
  212.  
  213. 10 => array(
  214. 9 => 7,
  215. 12 => 3
  216. ),
  217.  
  218. 11 => array(
  219. 4 => 7,
  220. 12 => 3,
  221. 7 => 6,
  222. 2 => 6,
  223. 6 => 7,
  224. 13 => 7
  225. ),
  226.  
  227. 12 => array(
  228. 10 => 3,
  229. 3 => 7,
  230. 11 => 3,
  231. 13 => 4,
  232. 14 => 2,
  233. 15 => 3
  234. ),
  235.  
  236. 13 => array(
  237. 12 => 4,
  238. 11 => 7,
  239. 14 => 3
  240. ),
  241.  
  242. 14 => array(
  243. 12 => 2,
  244. 15 => 2,
  245. 13 => 3
  246. ),
  247.  
  248. 15 => array(
  249. 12 => 3,
  250. 14 => 2
  251. )
  252. );
  253.  
  254.  
  255.  
  256. $numberOfNodes = count($pointNames);
  257.  
  258. /*Делаем квадратную матрицу путей размера $numberOfNodes, которая будет содержать время кратчайшего пути.
  259. Если путь не существует, то присваиваем ему значение бесконечности.
  260. */
  261. foreach ($paths as $i => $array) {
  262. for ($j = 0; $j < $numberOfNodes; $j++) {
  263. if (isset($paths[$i][$j]) == NULL) {
  264. $paths[$i][$j] = INF;
  265. }
  266. }
  267. }
  268.  
  269. //Массив, который будет содержать предпоследний шаг кратчайшего пути.
  270. $interimStep = array();
  271. for ($i = 0; $i < $numberOfNodes; $i++) {
  272. $interimStep[$i] = array_fill(0, $numberOfNodes, INF);
  273. }
  274.  
  275.  
  276. //Алгоритм Флойда-Уоршелла.
  277.  
  278. for ($k = 0; $k < $numberOfNodes; $k++) {
  279. for ($i = 0; $i < $numberOfNodes; $i++) {
  280. for ($j = 0; $j < $numberOfNodes; $j++) {
  281. if (($paths[$i][$k] + $paths[$k][$j]) < $paths[$i][$j]) {
  282. $paths[$i][$j] = $paths[$i][$k] + $paths[$k][$j];
  283. $interimStep[$i][$j] = $k;
  284. }
  285. }
  286. }
  287. }
  288.  
  289.  
  290.  
  291. //Тут вылетает предпоследняя нода (дом Раскольникова), но время всего пути выводится корректно.
  292. $startPoint = 0; // Петроградская
  293. $endPoint = 9; // Новая Голландия
  294. $shortestPath = getPath($startPoint, $endPoint, $interimStep);
  295. printPath($startPoint, $endPoint, $shortestPath, $paths, $pointNames);
  296.  
  297. //ст. м. Петроградская -> Петропавловская крепость
  298. $endPoint = 5;
  299. $shortestPath = getPath($startPoint, $endPoint, $interimStep);
  300. printPath($startPoint, $endPoint, $shortestPath, $paths, $pointNames);
  301.  
  302. /*Сенная Площадь -> Новая Голландия
  303. Тут все выводится корректно.
  304. */
  305. $startPoint = 12;
  306. $endPoint = 9;
  307. $shortestPath = getPath($startPoint, $endPoint, $interimStep);
  308. printPath($startPoint, $endPoint, $shortestPath, $paths, $pointNames);
  309.  
  310. //Летний сад -> ст. м. Спортивная
  311. $startPoint = 6;
  312. $endPoint = 3;
  313. $shortestPath = getPath($startPoint, $endPoint, $interimStep);
  314. printPath($startPoint, $endPoint, $shortestPath, $paths, $pointNames);
Success #stdin #stdout #stderr 0.01s 20520KB
stdin
Standard input is empty
stdout
Начальная точка: "ст. м. Петроградская"
Из нее едешь на метро до точки "ст. м. Горьковская" 3 мин.
Из нее едешь на метро до точки "Гостиный Двор" 6 мин.
Из нее едешь на метро до точки "Сенная Площадь" 3 мин.
Из нее  до точки "Новая Голландия" 10 мин.
В итоге ты попадешь в точку "Новая Голландия" за 22 мин. Приятной поездки!

Начальная точка: "ст. м. Петроградская"
Из нее едешь на метро до точки "ст. м. Горьковская" 3 мин.
Из нее идешь пешком до точки "Петропавловская крепость" 5 мин.
В итоге ты попадешь в точку "Петропавловская крепость" за 8 мин. Приятной поездки!

Начальная точка: "Сенная Площадь"
Из нее идешь пешком до точки "Дом Раскольникова" 3 мин.
Из нее едешь на автобусе до точки "Новая Голландия" 7 мин.
В итоге ты попадешь в точку "Новая Голландия" за 10 мин. Приятной поездки!

Начальная точка: "Летний сад"
Из нее идешь пешком до точки "Гостиный Двор" 7 мин.
Из нее едешь на метро до точки "Сенная Площадь" 3 мин.
Из нее едешь на метро до точки "ст. м. Спортивная" 7 мин.
В итоге ты попадешь в точку "ст. м. Спортивная" за 17 мин. Приятной поездки!

stderr
PHP Notice:  Undefined offset: 9 in /home/VVocog/prog.php on line 136