1+ // Dijkstra implementation to find the shortest path and print it........
2+
3+ #include < bits/stdc++.h>
4+ using namespace std ;
5+ typedef long long int ll;
6+ using ii= pair<ll,ll>;
7+ #define F first
8+ #define S second
9+ #define MP make_pair
10+
11+ vector<ii> v[100 ];
12+ ll dist[100 ];
13+ ll vst[100 ];
14+ vector<ll> parent;
15+
16+ class prioritize { // comparator design of priority queue...
17+ public: bool operator ()(ii &p1,ii &p2){
18+ return p1.S >p2.S ; // S -> second element of the pair ii... p-> (node,weight)
19+ }
20+ };
21+
22+ void dijkstra (ll s,ll n)
23+ {
24+ for (ll i=0 ;i<n;i++) // initialize the global variables so that they are reset after each function call...
25+ {
26+ dist[i]=1e18 ; // give infinite distance to the node3s initially....
27+ vst[i]=0 ; // mark all as unvisited initially.....
28+ }
29+
30+ dist[s]=0 ; // set the distance of the source node to be zero....
31+ parent[s]=-1 ; // set parent of source node as -1.....
32+ priority_queue<ii,vector<ii>,prioritize > pq; // use a priority queue if a pair...its internally wrapped in a vector..hence the
33+ pq.push (MP (s,0 )); // vector<ii> in the expression.....// push the source node ......
34+
35+ while (!pq.empty ()) // loop untill the pq is empty...
36+ {
37+ ii h=pq.top (); // pop the top most element in the ascending order of the weights...
38+ pq.pop ();
39+ ll node=h.F ;
40+
41+ if (vst[node])continue ; // if the node is already visited , we need not do anything....else...
42+ else
43+ {
44+ vst[node]=1 ; // mark it visited.....
45+ for (auto u: v[node]) // loop on all its neighbours in its adjacency list.....
46+ {
47+ ll neigh=u.F ; // let neigh be a node in its adjacency list and wt be its distance from the parent node 'node'
48+ ll wt=u.S ;
49+ if (dist[neigh]>dist[node]+wt) // if the distance of neigh from souce is > distance of it via the 'node', update the distance....
50+ {
51+ dist[neigh]=dist[node]+wt; // min distance updated...
52+ parent[neigh]=node; // push node as the parent of neigh as it get its shortst distance when accessed through 'node '...
53+ pq.push (make_pair (neigh,dist[neigh])); // now push the neigh into the pq, so that its neighbours can be analysed...
54+ }
55+
56+ }
57+ }
58+ }
59+ }
60+
61+
62+ int main ()
63+ {
64+ ios_base::sync_with_stdio (false );
65+ cin.tie (NULL );
66+
67+ ll t;
68+ cin>>t;
69+ while (t--)
70+ {
71+ ll n;
72+ cin>>n;
73+
74+ for (ll i=0 ;i<n;i++){ // clearing the adjacency list before addressing each testcase coz the global list may have the data from a
75+ v[i].clear (); // previous test case..
76+ }
77+
78+ for (ll i=0 ;i<n;i++)
79+ {
80+ for (ll j=0 ;j<n;j++)
81+ {
82+ ll x;
83+ cin>>x;
84+ // wt[i][j]=x;
85+ if (x!=0 )
86+ {
87+ v[i].push_back (MP (j,x)); // creating our adjacency list.we push a pair of (node,weight) in the adjac. list of another node
88+ }
89+ }
90+ }
91+
92+ ll s,g; // s-> source g-> destination....
93+ cin>>s>>g;
94+ parent.resize (n,-1 ); // must resize the parent vector otherwise u may get runtime (t)error....
95+ dijkstra (s,n); // calling dijkstra....
96+ ll j=dist[g]; // j-> shortest path of g from s...accesing it using the distance array
97+ cout<<j<<" \n " ;
98+
99+ vector<ll> path; // vector to store the shortest path nodes.....
100+ ll dest=g;
101+ while (dest!=-1 ) // in the end.. only the source will have a parent as -1,
102+ {
103+ path.push_back (dest);
104+ dest=parent[dest]; // -1->0->1->4->8->9->7
105+ }
106+ reverse (path.begin (),path.end ()); // reverse the path vector....
107+ for (auto no: path) // loop on the path vector and print the node elements.....
108+ {
109+ cout<<no<<" " ;
110+ }
111+ cout<<" \n " ;
112+ }
113+ }
0 commit comments