1- <?php 
2- 
3- /*  
4-  * Author: Mizanur rahman <[email protected] > 5-  *  
6-  */ 
7- 
8- function  dijkstra (array  $ graph , string  $ source , string  $ target ): array  {
9-     $ dist  = [];
10-     $ pred  = [];
11-     $ Queue  = new  SplPriorityQueue ();
12- 
13-     foreach  ($ graph  as  $ v  => $ adj ) {
14- 	$ dist [$ v ] = PHP_INT_MAX ;
15- 	$ pred [$ v ] = null ;
16- 	$ Queue ->insert ($ v , min ($ adj ));
17-     }
18- 
19-     $ dist [$ source ] = 0 ;
20- 
21-     while  (!$ Queue ->isEmpty ()) {
22- 	$ u  = $ Queue ->extract ();
23- 	if  (!empty ($ graph [$ u ])) {
24- 	    foreach  ($ graph [$ u ] as  $ v  => $ cost ) {
25- 		if  ($ dist [$ u ] + $ cost  < $ dist [$ v ]) {
26- 		    $ dist [$ v ] = $ dist [$ u ] + $ cost ;
27- 		    $ pred [$ v ] = $ u ;
28- 		}
29- 	    }
30- 	}
31-     }
32- 
33-     $ S  = new  SplStack ();
34-     $ u  = $ target ;
35-     $ distance  = 0 ;
36- 
37-     while  (isset ($ pred [$ u ]) && $ pred [$ u ]) {
38- 	$ S ->push ($ u );
39- 	$ distance  += $ graph [$ u ][$ pred [$ u ]];
40- 	$ u  = $ pred [$ u ];
41-     }
42- 
43-     if  ($ S ->isEmpty ()) {
44- 	return  ["distance "  => 0 , "path "  => $ S ];
45-     } else  {
46- 	$ S ->push ($ source );
47- 	return  ["distance "  => $ distance , "path "  => $ S ];
48-     }
49- }
50- 
51- $ graph  = [
52-     'A '  => ['B '  => 3 , 'C '  => 5 , 'D '  => 9 ],
53-     'B '  => ['A '  => 3 , 'C '  => 3 , 'D '  => 4 , 'E '  => 7 ],
54-     'C '  => ['A '  => 5 , 'B '  => 3 , 'D '  => 2 , 'E '  => 6 , 'F '  => 3 ],
55-     'D '  => ['A '  => 9 , 'B '  => 4 , 'C '  => 2 , 'E '  => 2 , 'F '  => 2 ],
56-     'E '  => ['B '  => 7 , 'C '  => 6 , 'D '  => 2 , 'F '  => 5 ],
57-     'F '  => ['C '  => 3 , 'D '  => 2 , 'E '  => 5 ],
58- ];
59- 
60- $ source  = "A " ;
61- $ target  = "F " ;
62- 
63- $ result  = dijkstra ($ graph , $ source , $ target );
64- extract ($ result );
65- 
66- echo  "Distance from  $ source to  $ target is  $ distance  \n" ;
67- echo  "Path to follow :  " ;
68- 
69- while  (!$ path ->isEmpty ()) {
70-     echo  $ path ->pop () . "\t" ;
1+ <?php 
2+ 
3+ /* 
4+  * Author: Mizanur rahman <[email protected] > 5+  *  
6+  */ 
7+ 
8+ function  dijkstra (array  $ graph , string  $ source , string  $ target ): array  {
9+     $ dist  = [];
10+     $ pred  = [];
11+     $ Queue  = new  SplPriorityQueue ();
12+ 
13+     foreach  ($ graph  as  $ v  => $ adj ) {
14+         $ dist [$ v ] = PHP_INT_MAX ;
15+         $ pred [$ v ] = null ;
16+         foreach  ($ adj  as  $ w  => $ cost ) {
17+             $ Queue ->insert ($ w , $ cost );
18+         }
19+     }
20+ 
21+     $ dist [$ source ] = 0 ;
22+ 
23+     while  (!$ Queue ->isEmpty ()) {
24+         $ u  = $ Queue ->extract ();
25+         if  (!empty ($ graph [$ u ])) {
26+             foreach  ($ graph [$ u ] as  $ v  => $ cost ) {
27+                 if  ($ dist [$ u ] + $ cost  < $ dist [$ v ]) {
28+                     $ dist [$ v ] = $ dist [$ u ] + $ cost ;
29+                     $ pred [$ v ] = $ u ;
30+                 }
31+             }
32+         }
33+     }
34+ 
35+     $ S  = new  SplStack ();
36+     $ u  = $ target ;
37+     $ distance  = 0 ;
38+ 
39+     while  (isset ($ pred [$ u ]) && $ pred [$ u ]) {
40+         $ S ->push ($ u );
41+         $ distance  += $ graph [$ u ][$ pred [$ u ]];
42+         $ u  = $ pred [$ u ];
43+     }
44+ 
45+     if  ($ S ->isEmpty ()) {
46+         return  ["distance "  => 0 , "path "  => $ S ];
47+     } else  {
48+         $ S ->push ($ source );
49+         return  ["distance "  => $ distance , "path "  => $ S ];
50+     }
51+ }
52+ 
53+ $ graph  = [
54+     'A '  => ['B '  => 3 , 'C '  => 5 , 'D '  => 9 ],
55+     'B '  => ['A '  => 3 , 'C '  => 3 , 'D '  => 4 , 'E '  => 7 ],
56+     'C '  => ['A '  => 5 , 'B '  => 3 , 'D '  => 2 , 'E '  => 6 , 'F '  => 3 ],
57+     'D '  => ['A '  => 9 , 'B '  => 4 , 'C '  => 2 , 'E '  => 2 , 'F '  => 2 ],
58+     'E '  => ['B '  => 7 , 'C '  => 6 , 'D '  => 2 , 'F '  => 5 ],
59+     'F '  => ['C '  => 3 , 'D '  => 2 , 'E '  => 5 ],
60+ ];
61+ 
62+ $ source  = "E " ;
63+ $ target  = "F " ;
64+ 
65+ $ result  = dijkstra ($ graph , $ source , $ target );
66+ extract ($ result );
67+ 
68+ echo  "Distance from  $ source to  $ target is  $ distance  \n" ;
69+ echo  "Path to follow :  " ;
70+ 
71+ while  (!$ path ->isEmpty ()) {
72+     echo  $ path ->pop () . "\t" ;
7173}
0 commit comments