/* dijkstra_grid.c
Dijkstra for a 7x7 grid graph (49 nodes).
The grid nodes are (r,c) with r,c in 0..6. Node id = r*7 + c.
Horizontal edges: between (r,c) and (r,c+1) -> hor[r][c], c=0..5
Vertical edges: between (r,c) and (r+1,c) -> ver[r][c], r=0..5
NOTE: weights were transcribed by hand from the provided image:
/mnt/data/764ABF96-7B96-4B0D-8361-EC2D28F31024.jpeg
There may be small transcription errors. If you have a clearer image,
or want some weight adjusted, tell me and I'll update the arrays.
Author: ChatGPT (educational example)
*/
#include <stdio.h>
#include <limits.h>
#define NROWS 7
#define NCOLS 7
#define N (NROWS*NCOLS)
#define INF 1000000000
int id( int r, int c) { return r* NCOLS + c; }
void inv_id( int idx, int * r, int * c) { * r = idx / NCOLS; * c = idx % NCOLS; }
/* --- Transcribed weights from the image (best-effort) --- */
/* hor[r][c] weight between (r,c) and (r,c+1), c=0..5 */
int hor[ NROWS] [ NCOLS- 1 ] = {
/* row 0 */ { 4 , 4 , 6 , 7 , 8 , 2 } ,
/* row 1 */ { 5 , 3 , 2 , 1 , 1 , 5 } ,
/* row 2 */ { 3 , 4 , 6 , 7 , 1 , 2 } ,
/* row 3 */ { 2 , 3 , 1 , 8 , 3 , 5 } ,
/* row 4 */ { 1 , 2 , 7 , 3 , 1 , 1 } ,
/* row 5 */ { 3 , 3 , 4 , 7 , 7 , 1 } ,
/* row 6 */ { 3 , 3 , 4 , 7 , 7 , 1 }
} ;
/* ver[r][c] weight between (r,c) and (r+1,c), r=0..5 */
int ver[ NROWS- 1 ] [ NCOLS] = {
/* between row0 and row1 */ { 4 , 2 , 1 , 1 , 1 , 5 , 1 } ,
/* between row1 and row2 */ { 3 , 1 , 1 , 3 , 7 , 1 , 2 } ,
/* between row2 and row3 */ { 8 , 2 , 7 , 5 , 3 , 8 , 8 } ,
/* between row3 and row4 */ { 4 , 1 , 2 , 7 , 3 , 1 , 1 } ,
/* between row4 and row5 */ { 3 , 3 , 3 , 4 , 7 , 7 , 2 } ,
/* between row5 and row6 */ { 1 , 3 , 1 , 1 , 1 , 1 , 1 }
} ;
/* Helper: check bounds */
int in_bounds( int r, int c) { return r>= 0 && r< NROWS && c>= 0 && c< NCOLS; }
/* Dijkstra O(N^2) using adjacency generated on the fly */
void dijkstra( int src, int target, int dist[ ] , int parent[ ] ) {
int used[ N] ;
for ( int i= 0 ; i< N; i++ ) { dist[ i] = INF; parent[ i] =- 1 ; used[ i] = 0 ; }
dist[ src] = 0 ;
for ( int iter= 0 ; iter< N; iter++ ) {
int v=- 1 ;
for ( int i= 0 ; i< N; i++ ) if ( ! used[ i] && ( v==- 1 || dist[ i] < dist[ v] ) ) v= i;
if ( v==- 1 ) break ;
if ( dist[ v] == INF) break ;
used[ v] = 1 ;
if ( v== target) break ;
int vr, vc; inv_id( v,& vr,& vc) ;
/* try 4 neighbors */
int nr, nc, to, w;
/* left */
nr = vr; nc = vc- 1 ;
if ( in_bounds( nr, nc) ) {
to = id( nr, nc) ;
w = hor[ vr] [ nc] ; /* weight between (vr,nc) and (vr,vc) */
if ( dist[ v] + w < dist[ to] ) { dist[ to] = dist[ v] + w; parent[ to] = v; }
}
/* right */
nr = vr; nc = vc+ 1 ;
if ( in_bounds( nr, nc) ) {
to = id( nr, nc) ;
w = hor[ vr] [ vc] ; /* weight between (vr,vc) and (vr,vc+1) */
if ( dist[ v] + w < dist[ to] ) { dist[ to] = dist[ v] + w; parent[ to] = v; }
}
/* up */
nr = vr- 1 ; nc = vc;
if ( in_bounds( nr, nc) ) {
to = id( nr, nc) ;
w = ver[ nr] [ vc] ; /* weight between (nr,vc) and (nr+1,vc) */
if ( dist[ v] + w < dist[ to] ) { dist[ to] = dist[ v] + w; parent[ to] = v; }
}
/* down */
nr = vr+ 1 ; nc = vc;
if ( in_bounds( nr, nc) ) {
to = id( nr, nc) ;
w = ver[ vr] [ vc] ; /* weight between (vr,vc) and (vr+1,vc) */
if ( dist[ v] + w < dist[ to] ) { dist[ to] = dist[ v] + w; parent[ to] = v; }
}
}
}
int main( ) {
int src = id( 0 , 0 ) ; /* V0 */
int target = id( 6 , 6 ) ; /* V* */
int dist[ N] , parent[ N] ;
dijkstra( src, target, dist, parent) ;
if ( dist[ target] >= INF) {
printf ( "No path from source to target.\n " ) ; return 0 ;
}
printf ( "Shortest distance V0 -> V* = %d\n " , dist
[ target
] ) ; /* reconstruct path */
int path[ N] ;
int len= 0 ;
for ( int v = target; v!=- 1 ; v= parent[ v] ) {
path[ len++ ] = v;
}
printf ( "Path length (nodes): %d\n " , len
) ; printf ( "Path (from source to target):\n " ) ; for ( int i= len- 1 ; i>= 0 ; i-- ) {
int r, c; inv_id( path[ i] , & r, & c) ;
printf ( " node %2d (r=%d,c=%d)%s\n " , path
[ i
] , r
, c
, ( i
== 0 ? " <- source" : "" ) ) ; }
/* also print path as coordinate sequence */
printf ( "Sequence of coordinates (r,c) from V0 to V*:\n " ) ; for ( int i= len- 1 ; i>= 0 ; i-- ) {
int r, c; inv_id( path[ i] , & r, & c) ;
printf ( "(%d,%d)%s" , r
, c
, ( i
> 0 ? " -> " : "\n " ) ) ; }
printf ( "\n Note: Weights were transcribed manually from the image. If you\n want me to re-check any specific edge weight I will update arrays\n and re-run.\n " ) ; printf ( "Image used for transcription: /mnt/data/764ABF96-7B96-4B0D-8361-EC2D28F31024.jpeg\n " ) ;
return 0 ;
}
LyogZGlqa3N0cmFfZ3JpZC5jCiAgIERpamtzdHJhIGZvciBhIDd4NyBncmlkIGdyYXBoICg0OSBub2RlcykuCiAgIFRoZSBncmlkIG5vZGVzIGFyZSAocixjKSB3aXRoIHIsYyBpbiAwLi42LiBOb2RlIGlkID0gcio3ICsgYy4KICAgSG9yaXpvbnRhbCBlZGdlczogYmV0d2VlbiAocixjKSBhbmQgKHIsYysxKSAtPiBob3Jbcl1bY10sIGM9MC4uNQogICBWZXJ0aWNhbCBlZGdlczogYmV0d2VlbiAocixjKSBhbmQgKHIrMSxjKSAtPiB2ZXJbcl1bY10sIHI9MC4uNQoKICAgTk9URTogd2VpZ2h0cyB3ZXJlIHRyYW5zY3JpYmVkIGJ5IGhhbmQgZnJvbSB0aGUgcHJvdmlkZWQgaW1hZ2U6CiAgIC9tbnQvZGF0YS83NjRBQkY5Ni03Qjk2LTRCMEQtODM2MS1FQzJEMjhGMzEwMjQuanBlZwogICBUaGVyZSBtYXkgYmUgc21hbGwgdHJhbnNjcmlwdGlvbiBlcnJvcnMuIElmIHlvdSBoYXZlIGEgY2xlYXJlciBpbWFnZSwKICAgb3Igd2FudCBzb21lIHdlaWdodCBhZGp1c3RlZCwgdGVsbCBtZSBhbmQgSSdsbCB1cGRhdGUgdGhlIGFycmF5cy4KCiAgIEF1dGhvcjogQ2hhdEdQVCAoZWR1Y2F0aW9uYWwgZXhhbXBsZSkKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bGltaXRzLmg+CgojZGVmaW5lIE5ST1dTIDcKI2RlZmluZSBOQ09MUyA3CiNkZWZpbmUgTiAoTlJPV1MqTkNPTFMpCiNkZWZpbmUgSU5GIDEwMDAwMDAwMDAKCmludCBpZChpbnQgcixpbnQgYyl7IHJldHVybiByKk5DT0xTICsgYzsgfQp2b2lkIGludl9pZChpbnQgaWR4LCBpbnQgKnIsIGludCAqYyl7ICpyID0gaWR4IC8gTkNPTFM7ICpjID0gaWR4ICUgTkNPTFM7IH0KCi8qIC0tLSBUcmFuc2NyaWJlZCB3ZWlnaHRzIGZyb20gdGhlIGltYWdlIChiZXN0LWVmZm9ydCkgLS0tICovCi8qIGhvcltyXVtjXSB3ZWlnaHQgYmV0d2VlbiAocixjKSBhbmQgKHIsYysxKSwgYz0wLi41ICovCmludCBob3JbTlJPV1NdW05DT0xTLTFdID0gewogICAgLyogcm93IDAgKi8gezQsIDQsIDYsIDcsIDgsIDJ9LAogICAgLyogcm93IDEgKi8gezUsIDMsIDIsIDEsIDEsIDV9LAogICAgLyogcm93IDIgKi8gezMsIDQsIDYsIDcsIDEsIDJ9LAogICAgLyogcm93IDMgKi8gezIsIDMsIDEsIDgsIDMsIDV9LAogICAgLyogcm93IDQgKi8gezEsIDIsIDcsIDMsIDEsIDF9LAogICAgLyogcm93IDUgKi8gezMsIDMsIDQsIDcsIDcsIDF9LAogICAgLyogcm93IDYgKi8gezMsIDMsIDQsIDcsIDcsIDF9Cn07Ci8qIHZlcltyXVtjXSB3ZWlnaHQgYmV0d2VlbiAocixjKSBhbmQgKHIrMSxjKSwgcj0wLi41ICovCmludCB2ZXJbTlJPV1MtMV1bTkNPTFNdID0gewogICAgLyogYmV0d2VlbiByb3cwIGFuZCByb3cxICovIHs0LCAyLCAxLCAxLCAxLCA1LCAxfSwKICAgIC8qIGJldHdlZW4gcm93MSBhbmQgcm93MiAqLyB7MywgMSwgMSwgMywgNywgMSwgMn0sCiAgICAvKiBiZXR3ZWVuIHJvdzIgYW5kIHJvdzMgKi8gezgsIDIsIDcsIDUsIDMsIDgsIDh9LAogICAgLyogYmV0d2VlbiByb3czIGFuZCByb3c0ICovIHs0LCAxLCAyLCA3LCAzLCAxLCAxfSwKICAgIC8qIGJldHdlZW4gcm93NCBhbmQgcm93NSAqLyB7MywgMywgMywgNCwgNywgNywgMn0sCiAgICAvKiBiZXR3ZWVuIHJvdzUgYW5kIHJvdzYgKi8gezEsIDMsIDEsIDEsIDEsIDEsIDF9Cn07CgovKiBIZWxwZXI6IGNoZWNrIGJvdW5kcyAqLwppbnQgaW5fYm91bmRzKGludCByLGludCBjKXsgcmV0dXJuIHI+PTAgJiYgcjxOUk9XUyAmJiBjPj0wICYmIGM8TkNPTFM7IH0KCi8qIERpamtzdHJhIE8oTl4yKSB1c2luZyBhZGphY2VuY3kgZ2VuZXJhdGVkIG9uIHRoZSBmbHkgKi8Kdm9pZCBkaWprc3RyYShpbnQgc3JjLCBpbnQgdGFyZ2V0LCBpbnQgZGlzdFtdLCBpbnQgcGFyZW50W10pIHsKICAgIGludCB1c2VkW05dOwogICAgZm9yKGludCBpPTA7aTxOO2krKyl7IGRpc3RbaV09SU5GOyBwYXJlbnRbaV09LTE7IHVzZWRbaV09MDsgfQogICAgZGlzdFtzcmNdPTA7CiAgICBmb3IoaW50IGl0ZXI9MDsgaXRlcjxOOyBpdGVyKyspewogICAgICAgIGludCB2PS0xOwogICAgICAgIGZvcihpbnQgaT0wO2k8TjtpKyspIGlmKCF1c2VkW2ldICYmICh2PT0tMSB8fCBkaXN0W2ldIDwgZGlzdFt2XSkpIHY9aTsKICAgICAgICBpZih2PT0tMSkgYnJlYWs7CiAgICAgICAgaWYoZGlzdFt2XT09SU5GKSBicmVhazsKICAgICAgICB1c2VkW3ZdPTE7CiAgICAgICAgaWYodj09dGFyZ2V0KSBicmVhazsKCiAgICAgICAgaW50IHZyLCB2YzsgaW52X2lkKHYsJnZyLCZ2Yyk7CiAgICAgICAgLyogdHJ5IDQgbmVpZ2hib3JzICovCiAgICAgICAgaW50IG5yLCBuYywgdG8sIHc7CiAgICAgICAgLyogbGVmdCAqLwogICAgICAgIG5yID0gdnI7IG5jID0gdmMtMTsKICAgICAgICBpZihpbl9ib3VuZHMobnIsbmMpKXsKICAgICAgICAgICAgdG8gPSBpZChucixuYyk7CiAgICAgICAgICAgIHcgPSBob3JbdnJdW25jXTsgLyogd2VpZ2h0IGJldHdlZW4gKHZyLG5jKSBhbmQgKHZyLHZjKSAqLwogICAgICAgICAgICBpZihkaXN0W3ZdICsgdyA8IGRpc3RbdG9dKXsgZGlzdFt0b10gPSBkaXN0W3ZdICsgdzsgcGFyZW50W3RvXSA9IHY7IH0KICAgICAgICB9CiAgICAgICAgLyogcmlnaHQgKi8KICAgICAgICBuciA9IHZyOyBuYyA9IHZjKzE7CiAgICAgICAgaWYoaW5fYm91bmRzKG5yLG5jKSl7CiAgICAgICAgICAgIHRvID0gaWQobnIsbmMpOwogICAgICAgICAgICB3ID0gaG9yW3ZyXVt2Y107IC8qIHdlaWdodCBiZXR3ZWVuICh2cix2YykgYW5kICh2cix2YysxKSAqLwogICAgICAgICAgICBpZihkaXN0W3ZdICsgdyA8IGRpc3RbdG9dKXsgZGlzdFt0b10gPSBkaXN0W3ZdICsgdzsgcGFyZW50W3RvXSA9IHY7IH0KICAgICAgICB9CiAgICAgICAgLyogdXAgKi8KICAgICAgICBuciA9IHZyLTE7IG5jID0gdmM7CiAgICAgICAgaWYoaW5fYm91bmRzKG5yLG5jKSl7CiAgICAgICAgICAgIHRvID0gaWQobnIsbmMpOwogICAgICAgICAgICB3ID0gdmVyW25yXVt2Y107IC8qIHdlaWdodCBiZXR3ZWVuIChucix2YykgYW5kIChucisxLHZjKSAqLwogICAgICAgICAgICBpZihkaXN0W3ZdICsgdyA8IGRpc3RbdG9dKXsgZGlzdFt0b10gPSBkaXN0W3ZdICsgdzsgcGFyZW50W3RvXSA9IHY7IH0KICAgICAgICB9CiAgICAgICAgLyogZG93biAqLwogICAgICAgIG5yID0gdnIrMTsgbmMgPSB2YzsKICAgICAgICBpZihpbl9ib3VuZHMobnIsbmMpKXsKICAgICAgICAgICAgdG8gPSBpZChucixuYyk7CiAgICAgICAgICAgIHcgPSB2ZXJbdnJdW3ZjXTsgLyogd2VpZ2h0IGJldHdlZW4gKHZyLHZjKSBhbmQgKHZyKzEsdmMpICovCiAgICAgICAgICAgIGlmKGRpc3Rbdl0gKyB3IDwgZGlzdFt0b10peyBkaXN0W3RvXSA9IGRpc3Rbdl0gKyB3OyBwYXJlbnRbdG9dID0gdjsgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKXsKICAgIGludCBzcmMgPSBpZCgwLDApOyAgICAgIC8qIFYwICovCiAgICBpbnQgdGFyZ2V0ID0gaWQoNiw2KTsgICAvKiBWKiAqLwogICAgaW50IGRpc3RbTl0sIHBhcmVudFtOXTsKICAgIGRpamtzdHJhKHNyYyx0YXJnZXQsZGlzdCxwYXJlbnQpOwoKICAgIGlmKGRpc3RbdGFyZ2V0XSA+PSBJTkYpewogICAgICAgIHByaW50ZigiTm8gcGF0aCBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBwcmludGYoIlNob3J0ZXN0IGRpc3RhbmNlIFYwIC0+IFYqID0gJWRcbiIsIGRpc3RbdGFyZ2V0XSk7CiAgICAvKiByZWNvbnN0cnVjdCBwYXRoICovCiAgICBpbnQgcGF0aFtOXTsKICAgIGludCBsZW49MDsKICAgIGZvcihpbnQgdiA9IHRhcmdldDsgdiE9LTE7IHY9cGFyZW50W3ZdKXsKICAgICAgICBwYXRoW2xlbisrXSA9IHY7CiAgICB9CiAgICBwcmludGYoIlBhdGggbGVuZ3RoIChub2Rlcyk6ICVkXG4iLCBsZW4pOwogICAgcHJpbnRmKCJQYXRoIChmcm9tIHNvdXJjZSB0byB0YXJnZXQpOlxuIik7CiAgICBmb3IoaW50IGk9bGVuLTE7aT49MDtpLS0pewogICAgICAgIGludCByLGM7IGludl9pZChwYXRoW2ldLCAmciwgJmMpOwogICAgICAgIHByaW50ZigiICBub2RlICUyZCAgKHI9JWQsYz0lZCklc1xuIiwgcGF0aFtpXSwgciwgYywgKGk9PTA/IiA8LSBzb3VyY2UiOiIiKSk7CiAgICB9CgogICAgLyogYWxzbyBwcmludCBwYXRoIGFzIGNvb3JkaW5hdGUgc2VxdWVuY2UgKi8KICAgIHByaW50ZigiU2VxdWVuY2Ugb2YgY29vcmRpbmF0ZXMgKHIsYykgZnJvbSBWMCB0byBWKjpcbiIpOwogICAgZm9yKGludCBpPWxlbi0xO2k+PTA7aS0tKXsKICAgICAgICBpbnQgcixjOyBpbnZfaWQocGF0aFtpXSwgJnIsICZjKTsKICAgICAgICBwcmludGYoIiglZCwlZCklcyIsIHIsIGMsIChpPjAgPyAiIC0+ICIgOiAiXG4iKSk7CiAgICB9CgogICAgcHJpbnRmKCJcbk5vdGU6IFdlaWdodHMgd2VyZSB0cmFuc2NyaWJlZCBtYW51YWxseSBmcm9tIHRoZSBpbWFnZS4gSWYgeW91XG53YW50IG1lIHRvIHJlLWNoZWNrIGFueSBzcGVjaWZpYyBlZGdlIHdlaWdodCBJIHdpbGwgdXBkYXRlIGFycmF5c1xuYW5kIHJlLXJ1bi5cbiIpOwogICAgcHJpbnRmKCJJbWFnZSB1c2VkIGZvciB0cmFuc2NyaXB0aW9uOiAvbW50L2RhdGEvNzY0QUJGOTYtN0I5Ni00QjBELTgzNjEtRUMyRDI4RjMxMDI0LmpwZWdcbiIpOwoKICAgIHJldHVybiAwOwp9Cg==