#include <bits/stdc++.h>//!IMPLEMENTING THE DFS AND BFS FOR THE FOLLOWING GRAPH
#include <functional>
using namespace std;
//std::priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > > minheap;
struct node{ int data;
int weight;
node* next; } ;
struct List{ node* head; } ; //! this is the first element of the list to store the address of the linked list of the vertex
struct graph{ int noe; List* arr; } ; //! graph is basically giving us a pointer to the first element of the array of (linked list which stores the address of other vertex)
graph* makegraph( int num) //! function to create the basic body of the graph
{ //!first we need to dynamically allocate an array of linked lists , for storing "num" no. of linked lists of vertex
List* temparr= new List[ num] ; //!creating an array of the pointers of 1st element of adjacent vertex
graph* g= new graph;
g- > arr= temparr;
for ( int i= 0 ; i< num; i++ )
temparr[ i] .head = NULL ; //! second we need to dynamical create a linked list of one element point to a NULL pointer
g- > noe= num;
return g;
}
void add( graph* g,int startvertex,int endvertex,int weight)
{ //!first we need to create a node to store the vertex and the address of the next vertex
node* newnode= new node;
//!THE UNDERNEATH STEPS ARE NOTHING SPECIAL BUT JUST ADDING AN ELEMENT TO THE FRONT OF THE LINKED LIST
newnode- > data= endvertex;
newnode- > weight= weight;
newnode- > next= g- > arr[ startvertex] .head ; //! making the address of next in node point to the head
//!since adding an element at the front of linked list takes O(1) time therefore we do so
g- > arr[ startvertex] .head = newnode; //! now we make our new node the head of the linked list
//!THE UNDERNEATH STEPS NEED TO BE DONE ONLY IN THE CASE OF UNDIRECTED GRAPH
node* newnode2= new node;
newnode2- > data= startvertex;
newnode2- > weight= weight;
newnode2- > next= g- > arr[ endvertex] .head ;
g- > arr[ endvertex] .head = newnode2;
}
void print( graph* g)
{
for ( int i= 0 ; i< g- > noe; i++ )
{ node* temp= g- > arr[ i] .head ;
cout << "HEAD " << i+ 1 << "::" ;
while ( temp! = NULL )
{ cout << "->" << temp- > data+ 1 ;
temp= temp- > next;
}
cout << endl;
}
}
void dijkstra( graph* g, int startvertex)
{ set< pair< int ,int > > distindex;
pair< int ,int > start;
set< pair< int ,int > > :: iterator it;
distindex.insert ( make_pair( 0 ,startvertex) ) ;
for ( int i= 1 ; i< g- > noe; i++ )
distindex.insert ( make_pair( INT_MAX ,i) ) ;
while ( ! distindex.empty ( ) )
{
it= distindex.begin ( ) ;
start= * it;
cout << start.second << " " << start.first << endl;
distindex.erase ( it) ;
node* temp= g- > arr[ start.second ] .head ;
while ( temp)
{ for ( it= distindex.begin ( ) ; it! = distindex.end ( ) ; it++ )
if ( it- > second== ( temp- > data) && ( temp- > weight+ start.first ) <= it- > first)
{ distindex.erase ( it) ;
distindex.insert ( make_pair( ( temp- > weight+ start.first ) ,temp- > data) ) ;
break ;
}
temp= temp- > next;
}
}
}
int main( )
{
//!IMPLEMENTING DIJKSTRA
int num= 9 ;
graph* g= makegraph( num) ;
g- > noe= num;
add( g, 0 , 1 , 4 ) ;
add( g, 0 , 7 , 8 ) ;
add( g, 1 , 2 , 8 ) ;
add( g, 1 , 7 , 11 ) ;
add( g, 2 , 3 , 7 ) ;
add( g, 2 , 8 , 2 ) ;
add( g, 2 , 5 , 4 ) ;
add( g, 3 , 4 , 9 ) ;
add( g, 3 , 5 , 14 ) ;
add( g, 4 , 5 , 10 ) ;
add( g, 5 , 6 , 2 ) ;
add( g, 6 , 7 , 1 ) ;
add( g, 6 , 8 , 6 ) ;
add( g, 7 , 8 , 7 ) ;
dijkstra( g, 0 ) ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Ly8hSU1QTEVNRU5USU5HIFRIRSBERlMgQU5EIEJGUyBGT1IgVEhFIEZPTExPV0lORyBHUkFQSAojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy9zdGQ6OnByaW9yaXR5X3F1ZXVlPGludCx2ZWN0b3I8cGFpcjxpbnQsaW50PiA+LGdyZWF0ZXI8cGFpcjxpbnQsaW50PiA+ID4gbWluaGVhcDsKc3RydWN0IG5vZGV7aW50IGRhdGE7CiAgICAgICAgICAgIGludCB3ZWlnaHQ7CiAgICAgICAgICAgIG5vZGUqbmV4dDt9OwpzdHJ1Y3QgTGlzdHtub2RlKiBoZWFkO307Ly8hIHRoaXMgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIHRoZSB2ZXJ0ZXgKc3RydWN0IGdyYXBoe2ludCBub2U7TGlzdCogYXJyOyB9Oy8vISBncmFwaCBpcyBiYXNpY2FsbHkgZ2l2aW5nIHVzIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgb2YgKGxpbmtlZCBsaXN0IHdoaWNoIHN0b3JlcyB0aGUgYWRkcmVzcyBvZiBvdGhlciB2ZXJ0ZXgpCmdyYXBoKiBtYWtlZ3JhcGgoaW50IG51bSkvLyEgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBiYXNpYyBib2R5IG9mIHRoZSBncmFwaAp7ICAgIC8vIWZpcnN0IHdlIG5lZWQgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgYW4gYXJyYXkgb2YgbGlua2VkIGxpc3RzICwgZm9yIHN0b3JpbmcgIm51bSIgbm8uIG9mIGxpbmtlZCBsaXN0cyBvZiB2ZXJ0ZXgKICAgICBMaXN0KiB0ZW1wYXJyPW5ldyBMaXN0W251bV07Ly8hY3JlYXRpbmcgYW4gYXJyYXkgb2YgdGhlIHBvaW50ZXJzIG9mIDFzdCBlbGVtZW50IG9mIGFkamFjZW50IHZlcnRleAogICAgZ3JhcGgqIGc9bmV3IGdyYXBoOwogICAgZy0+YXJyPXRlbXBhcnI7CiAgICBmb3IoaW50IGk9MDtpPG51bTtpKyspCiAgICAgICAgdGVtcGFycltpXS5oZWFkPU5VTEw7Ly8hIHNlY29uZCB3ZSBuZWVkIHRvIGR5bmFtaWNhbCBjcmVhdGUgYSBsaW5rZWQgbGlzdCBvZiBvbmUgZWxlbWVudCBwb2ludCB0byBhIE5VTEwgcG9pbnRlcgogICAgZy0+bm9lPW51bTsKICAgIHJldHVybiBnOwoKfQp2b2lkIGFkZChncmFwaCogZyxpbnQgc3RhcnR2ZXJ0ZXgsaW50IGVuZHZlcnRleCxpbnQgd2VpZ2h0KQp7IC8vIWZpcnN0IHdlIG5lZWQgdG8gY3JlYXRlIGEgbm9kZSB0byBzdG9yZSB0aGUgdmVydGV4IGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCB2ZXJ0ZXgKICAgIG5vZGUqIG5ld25vZGU9bmV3IG5vZGU7CgogICAgLy8hVEhFIFVOREVSTkVBVEggU1RFUFMgQVJFIE5PVEhJTkcgU1BFQ0lBTCBCVVQgSlVTVCBBRERJTkcgQU4gRUxFTUVOVCBUTyBUSEUgRlJPTlQgT0YgVEhFIExJTktFRCBMSVNUCiAgICBuZXdub2RlLT5kYXRhPWVuZHZlcnRleDsKICAgIG5ld25vZGUtPndlaWdodD13ZWlnaHQ7CiAgICBuZXdub2RlLT5uZXh0PWctPmFycltzdGFydHZlcnRleF0uaGVhZDsvLyEgbWFraW5nIHRoZSBhZGRyZXNzIG9mIG5leHQgaW4gbm9kZSBwb2ludCB0byB0aGUgaGVhZAoKICAgIC8vIXNpbmNlIGFkZGluZyBhbiBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiBsaW5rZWQgbGlzdCB0YWtlcyBPKDEpIHRpbWUgdGhlcmVmb3JlIHdlIGRvIHNvCiAgICBnLT5hcnJbc3RhcnR2ZXJ0ZXhdLmhlYWQ9bmV3bm9kZTsvLyEgbm93IHdlIG1ha2Ugb3VyIG5ldyBub2RlIHRoZSBoZWFkIG9mIHRoZSBsaW5rZWQgbGlzdAoKLy8hVEhFIFVOREVSTkVBVEggU1RFUFMgTkVFRCBUTyBCRSBET05FIE9OTFkgSU4gVEhFIENBU0UgT0YgVU5ESVJFQ1RFRCBHUkFQSAogICAgbm9kZSogbmV3bm9kZTI9bmV3IG5vZGU7CiAgICAgbmV3bm9kZTItPmRhdGE9c3RhcnR2ZXJ0ZXg7CiAgICAgbmV3bm9kZTItPndlaWdodD13ZWlnaHQ7CiAgICAgbmV3bm9kZTItPm5leHQ9Zy0+YXJyW2VuZHZlcnRleF0uaGVhZDsKICAgICBnLT5hcnJbZW5kdmVydGV4XS5oZWFkPW5ld25vZGUyOwoKfQoKCnZvaWQgcHJpbnQoZ3JhcGgqZykKewpmb3IoaW50IGk9MDtpPGctPm5vZTtpKyspCiAgIHtub2RlKnRlbXA9IGctPmFycltpXS5oZWFkOwogICAgY291dDw8IkhFQUQgIjw8IGkrMTw8Ijo6IjsKICAgd2hpbGUodGVtcCE9TlVMTCkKICAgICAgIHtjb3V0PDwiLT4iPDx0ZW1wLT5kYXRhKzE7CiAgICAgICAgdGVtcD10ZW1wLT5uZXh0OwogICAgICAgfQoKICAgICAgIGNvdXQ8PGVuZGw7CiAgIH0KCn0KCnZvaWQgZGlqa3N0cmEoZ3JhcGgqZywgaW50IHN0YXJ0dmVydGV4KQp7IHNldDxwYWlyPGludCxpbnQ+ID5kaXN0aW5kZXg7CiAgcGFpcjxpbnQsaW50PnN0YXJ0OwogIHNldDxwYWlyPGludCxpbnQ+ID46Oml0ZXJhdG9yIGl0OwogIGRpc3RpbmRleC5pbnNlcnQobWFrZV9wYWlyKDAsc3RhcnR2ZXJ0ZXgpKTsKICBmb3IoaW50IGk9MTtpPGctPm5vZTtpKyspCiAgICBkaXN0aW5kZXguaW5zZXJ0KG1ha2VfcGFpcihJTlRfTUFYLGkpKTsKICB3aGlsZSghZGlzdGluZGV4LmVtcHR5KCkpCiAgewogICBpdD1kaXN0aW5kZXguYmVnaW4oKTsKICAgc3RhcnQ9Kml0OwogICBjb3V0PDxzdGFydC5zZWNvbmQ8PCIgIjw8c3RhcnQuZmlyc3Q8PGVuZGw7CiAgICAgZGlzdGluZGV4LmVyYXNlKGl0KTsKICAgIG5vZGUqIHRlbXA9Zy0+YXJyW3N0YXJ0LnNlY29uZF0uaGVhZDsKICAgIHdoaWxlKHRlbXApCiAgICB7IGZvcihpdD1kaXN0aW5kZXguYmVnaW4oKTtpdCE9ZGlzdGluZGV4LmVuZCgpO2l0KyspCiAgICAgICBpZihpdC0+c2Vjb25kPT0odGVtcC0+ZGF0YSkmJih0ZW1wLT53ZWlnaHQrc3RhcnQuZmlyc3QpPD1pdC0+Zmlyc3QpCiAgICAgICAgeyBkaXN0aW5kZXguZXJhc2UoaXQpOwogICAgICAgIGRpc3RpbmRleC5pbnNlcnQobWFrZV9wYWlyKCh0ZW1wLT53ZWlnaHQrc3RhcnQuZmlyc3QpLHRlbXAtPmRhdGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgdGVtcD10ZW1wLT5uZXh0OwoKICAgIH0KCgogICAgIH0KCn0KCgoKaW50IG1haW4oKQp7CiAgICAvLyFJTVBMRU1FTlRJTkcgRElKS1NUUkEKICAgIGludCBudW09OTsKICAgIGdyYXBoKiBnPW1ha2VncmFwaChudW0pOwogICAgZy0+bm9lPW51bTsKCgoKICAgIGFkZChnLCAwLCAxLCA0KTsKICAgIGFkZChnLCAwLCA3LCA4KTsKICAgIGFkZChnLCAxLCAyLCA4KTsKICAgIGFkZChnLCAxLCA3LCAxMSk7CiAgICBhZGQoZywgMiwgMywgNyk7CiAgICBhZGQoZywgMiwgOCwgMik7CiAgICBhZGQoZywgMiwgNSwgNCk7CiAgICBhZGQoZywgMywgNCwgOSk7CiAgICBhZGQoZywgMywgNSwgMTQpOwogICAgYWRkKGcsIDQsIDUsIDEwKTsKICAgIGFkZChnLCA1LCA2LCAyKTsKICAgIGFkZChnLCA2LCA3LCAxKTsKICAgIGFkZChnLCA2LCA4LCA2KTsKICAgIGFkZChnLCA3LCA4LCA3KTsKCiAgIGRpamtzdHJhKGcsIDApOwoKCgoKCn0K