#include <bits/stdc++.h>
using namespace std;
class Graph{
public :
int n, m;
bool isDirected;
vector< vector< int >> adj;
map< pair< int , int > , int > weightPairs;
Graph( int nodes) : adj( nodes) {
n = nodes;
m = 0 ;
}
void addEdge( int u, int v, int weight) {
if ( u >= n || v >= n || u < 0 || v < 0 ) {
cout << "Either of the vertices doesn't exists in the graph.\n " ;
return ;
}
weightPairs[ { u, v} ] = weight;
adj[ u] .push_back ( v) ;
++ m;
}
void dfs( int u, vector< bool > & visited, stack< int > & st, bool & useStack) {
visited[ u] = true ;
if ( ! useStack)
cout << u<< " " ;
for ( auto adjNode: adj[ u] ) {
if ( ! visited[ adjNode] ) {
dfs( adjNode, visited, st, useStack) ;
if ( useStack) {
st.push ( adjNode) ;
}
}
}
}
void singleSourceShortestPath( int src) {
vector< bool > visited( n, false ) ;
stack< int > st; // Stack for storing the topological sort of nodes.
bool useStack = true ;
if ( ! useStack)
cout << "DFS: " ;
for ( int i= 0 ; i< n; ++ i) {
if ( ! visited[ i] ) {
dfs( i, visited, st, useStack) ;
if ( useStack)
st.push ( i) ;
}
}
visited = vector< bool > ( n, false ) ;
vector< int > shortestPaths( n, INT_MAX ) , predecessors( n, - 1 ) ;
shortestPaths[ src] = 0 ;
while ( ! st.empty ( ) ) {
int u = st.top ( ) ;
visited[ u] = true ;
for ( auto v: adj[ u] ) {
int distUtoV = weightPairs[ { u, v} ] ? weightPairs[ { u, v} ] : weightPairs[ { v, u} ] ;
if ( ! visited[ v] && shortestPaths[ u] ! = INT_MAX &&
distUtoV + shortestPaths[ u] < shortestPaths[ v] ) {
predecessors[ v] = u;
shortestPaths[ v] = distUtoV + shortestPaths[ u] ;
}
}
st.pop ( ) ;
}
cout << "The shortest paths from given source " << src<< " to\n all other nodes are,\n " ;
for ( int u = 0 ; u < n; ++ u) {
if ( u ! = src) {
cout << "----------------------------------------\n " ;
if ( shortestPaths[ u] < INT_MAX ) {
cout << "Path length: " << shortestPaths[ u] << " | Path: " ;
printPath( predecessors, u) ;
cout << "\n " ;
}
else {
cout << "No path exits from given source " << src<< " to " << u<< "\n " ;
}
}
}
}
void printGraph( ) {
if ( ! m) {
cout << "The graph is empty!!\n " ;
return ;
}
cout << "Total # edges in the graph: " << m<< "\n " ;
for ( int i = 0 ; i < n; ++ i) {
cout << "The edges from vertex " << i<< ":" ;
for ( auto val: adj[ i] )
cout << "->" << val;
cout << "\n " ;
}
cout << "======================================================\n " ;
}
void printPath( vector< int > & predecessors, int par) {
if ( par == - 1 )
return ;
printPath( predecessors, predecessors[ par] ) ;
cout << ( predecessors[ par] == - 1 ? "" : "->" ) << par;
}
} ;
int main( )
{
int n, u, v, w;
cin >> n;
Graph g( n) ;
cin >> n;
for ( int i= 0 ; i < n; ++ i) {
cin >> u>> v>> w;
g.addEdge ( u,v,w) ;
}
g.printGraph ( ) ;
cin >> n;
g.singleSourceShortestPath ( n) ;
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY2xhc3MgR3JhcGh7CglwdWJsaWM6CglpbnQgbiwgbTsKCWJvb2wgaXNEaXJlY3RlZDsKCXZlY3Rvcjx2ZWN0b3I8aW50Pj4gYWRqOwoJbWFwPHBhaXI8aW50LCBpbnQ+LCBpbnQ+IHdlaWdodFBhaXJzOwogCglHcmFwaChpbnQgbm9kZXMpOiBhZGoobm9kZXMpewoJCW4gPSBub2RlczsKCQltID0gMDsKCX0KIAoJdm9pZCBhZGRFZGdlKGludCB1LCBpbnQgdiwgaW50IHdlaWdodCl7CgkJaWYodSA+PSBuIHx8IHYgPj1uIHx8IHUgPCAwIHx8IHYgPCAwKXsgCgkJCWNvdXQ8PCJFaXRoZXIgb2YgdGhlIHZlcnRpY2VzIGRvZXNuJ3QgZXhpc3RzIGluIHRoZSBncmFwaC5cbiI7CgkJCXJldHVybjsKCQl9CgkJCgkJd2VpZ2h0UGFpcnNbe3UsIHZ9XSA9IHdlaWdodDsKCQkKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOwoJCQoJCSsrbTsKCX0KIAoJdm9pZCBkZnMoaW50IHUsIHZlY3Rvcjxib29sPiAmdmlzaXRlZCwgc3RhY2s8aW50PiAmc3QsIGJvb2wgJnVzZVN0YWNrKXsKCQl2aXNpdGVkW3VdID0gdHJ1ZTsKCQkKCQlpZighdXNlU3RhY2spCgkJCWNvdXQ8PHU8PCIgIjsKIAoJCWZvcihhdXRvIGFkak5vZGU6IGFkalt1XSl7CgkJCWlmKCF2aXNpdGVkW2Fkak5vZGVdKXsKCQkJCWRmcyhhZGpOb2RlLCB2aXNpdGVkLCBzdCwgdXNlU3RhY2spOwogCgkJCQlpZih1c2VTdGFjayl7CgkJCQkJc3QucHVzaChhZGpOb2RlKTsKCQkJCX0KCQkJfQoJCX0KCX0KIAoJdm9pZCBzaW5nbGVTb3VyY2VTaG9ydGVzdFBhdGgoaW50IHNyYyl7CgkJdmVjdG9yPGJvb2w+IHZpc2l0ZWQobiwgZmFsc2UpOwoJCXN0YWNrPGludD4gc3Q7IC8vIFN0YWNrIGZvciBzdG9yaW5nIHRoZSB0b3BvbG9naWNhbCBzb3J0IG9mIG5vZGVzLiAKIAoJCWJvb2wgdXNlU3RhY2sgPSB0cnVlOwoJCQoJCWlmKCF1c2VTdGFjaykKCQkJY291dDw8IkRGUzogIjsKCQkKCQlmb3IoaW50IGk9MDsgaTxuOyArK2kpewoJCQlpZighdmlzaXRlZFtpXSl7CgkJCQlkZnMoaSwgdmlzaXRlZCwgc3QsIHVzZVN0YWNrKTsKCQkJCQoJCQkJaWYodXNlU3RhY2spCgkJCQkJc3QucHVzaChpKTsKCQkJfQoJCX0KIAoJCXZpc2l0ZWQgPSB2ZWN0b3I8Ym9vbD4obiwgZmFsc2UpOwoJCXZlY3RvcjxpbnQ+IHNob3J0ZXN0UGF0aHMobiwgSU5UX01BWCksIHByZWRlY2Vzc29ycyhuLCAtMSk7CgkJCgkJc2hvcnRlc3RQYXRoc1tzcmNdID0gMDsKCQkKCQl3aGlsZSghc3QuZW1wdHkoKSl7CgkJCWludCB1ID0gc3QudG9wKCk7CgkJCQoJCQl2aXNpdGVkW3VdID0gdHJ1ZTsKCQkJCgkJCWZvcihhdXRvIHY6IGFkalt1XSl7CgkJCQkKCQkJCWludCBkaXN0VXRvViA9IHdlaWdodFBhaXJzW3t1LCB2fV0gPyB3ZWlnaHRQYWlyc1t7dSwgdn1dIDogd2VpZ2h0UGFpcnNbe3YsIHV9XTsKIAoJCQkJaWYoIXZpc2l0ZWRbdl0gJiYgc2hvcnRlc3RQYXRoc1t1XSAhPSBJTlRfTUFYICYmCgkJCQkJZGlzdFV0b1YgKyBzaG9ydGVzdFBhdGhzW3VdIDwgc2hvcnRlc3RQYXRoc1t2XSl7CiAKCQkJCQlwcmVkZWNlc3NvcnNbdl0gPSB1OwoJCQkJCXNob3J0ZXN0UGF0aHNbdl0gPSBkaXN0VXRvViArIHNob3J0ZXN0UGF0aHNbdV07CgkJCQl9CgkJCX0KIAoJCQlzdC5wb3AoKTsKCQl9CgkJCgkJY291dDw8IlRoZSBzaG9ydGVzdCBwYXRocyBmcm9tIGdpdmVuIHNvdXJjZSAiPDxzcmM8PCIgdG9cbmFsbCBvdGhlciBub2RlcyBhcmUsXG4iOwogCgkJCWZvcihpbnQgdSA9IDA7IHUgPCBuOyArK3UpewoJCQkJaWYodSAhPSBzcmMpewoJCQkJCWNvdXQ8PCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwoJCQkJCWlmKHNob3J0ZXN0UGF0aHNbdV0gPCBJTlRfTUFYKXsKCQkJCQkJY291dDw8IlBhdGggbGVuZ3RoOiAiPDxzaG9ydGVzdFBhdGhzW3VdPDwiIHwgUGF0aDogIjsKCQkJCQkJcHJpbnRQYXRoKHByZWRlY2Vzc29ycywgdSk7CgkJCQkJCWNvdXQ8PCJcbiI7CgkJCQkJfQoJCQkJCWVsc2V7CgkJCQkJCWNvdXQ8PCJObyBwYXRoIGV4aXRzIGZyb20gZ2l2ZW4gc291cmNlICI8PHNyYzw8IiB0byAiPDx1PDwiXG4iOwoJCQkJCX0KCQkJCX0KCQkJfQogCgl9CiAKCXZvaWQgcHJpbnRHcmFwaCgpeyAKIAoJCWlmKCFtKXsgCgkJCWNvdXQ8PCJUaGUgZ3JhcGggaXMgZW1wdHkhIVxuIjsKCQkJcmV0dXJuOwoJCX0gCiAKCQljb3V0PDwiVG90YWwgIyBlZGdlcyBpbiB0aGUgZ3JhcGg6ICI8PG08PCJcbiI7CiAKCQlmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKXsgCgkJCWNvdXQ8PCJUaGUgZWRnZXMgZnJvbSB2ZXJ0ZXggIjw8aTw8IjoiOwogCgkJCWZvcihhdXRvIHZhbDogYWRqW2ldKSAgCgkJCQljb3V0PDwiLT4iPDx2YWw7CiAKCQkJY291dDw8IlxuIjsgCgkJfQoJCWNvdXQ8PCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Cgl9CgkKCXZvaWQgcHJpbnRQYXRoKHZlY3RvcjxpbnQ+ICZwcmVkZWNlc3NvcnMsIGludCBwYXIpewoJCWlmKHBhciA9PSAtMSkKCQkJcmV0dXJuOwogCgkJcHJpbnRQYXRoKHByZWRlY2Vzc29ycywgcHJlZGVjZXNzb3JzW3Bhcl0pOwogCgkJY291dDw8KHByZWRlY2Vzc29yc1twYXJdID09IC0xID8gIiI6Ii0+Iik8PHBhcjsKCX0KfTsKIAppbnQgbWFpbigpCnsKCWludCBuLCB1LCB2LCB3OyAKCWNpbj4+bjsKIAoJR3JhcGggZyhuKTsKIAoJY2luPj5uOwogCglmb3IoaW50IGk9MDsgaSA8IG47ICsraSl7CgkJY2luPj51Pj52Pj53OwoJCWcuYWRkRWRnZSh1LHYsdyk7Cgl9CiAKCWcucHJpbnRHcmFwaCgpOwoJCgljaW4+Pm47CglnLnNpbmdsZVNvdXJjZVNob3J0ZXN0UGF0aChuKTsKIAoJcmV0dXJuIDA7Cn0=