#include <iostream>
#include <list>
#include <string>
#include <vector>
using namespace std;
vector < string> v1 = { "Prague" , "Helsinki" , "Beijing" , "Tokyo" , "Jakarta" ,"London" , "New York" } ;
vector < int > w = { } ;
// A directed graph using
// adjacency list representation
class Graph {
int V; // No. of vertices in graph
list< int > * adj; // Pointer to an array containing adjacency lists
list< int > * adj_weights; // Pointer to an array containing adjacency lists
// A recursive function used by printAllPaths()
void printAllPathsUtil( int , int , bool [ ] , int [ ] , int [ ] , int & , int ) ;
public :
Graph( int V) ; // Constructor
void addVertex( string name) ;
void addEdge( int u, int v, int weight) ;
void printAllPaths( int s, int d) ;
} ;
Graph:: Graph ( int V)
{
this- > V = V;
adj = new list< int > [ V] ;
adj_weights = new list< int > [ V] ;
}
void Graph:: addEdge ( int u, int v, int weight)
{
adj[ u] .push_back ( v) ; // Add v to u’s list.
adj_weights[ u] .push_back ( weight) ; // Add the weight of the path as well.
}
// Prints all paths from 's' to 'd'
void Graph:: printAllPaths ( int s, int d)
{
// Mark all the vertices as not visited
bool * visited = new bool [ V] ;
// Create an array to store paths
int * path = new int [ V] ;
int * path_costs = new int [ V] ;
int path_index = 0 ; // Initialize path[] and path_costs[] as empty
// Initialize all vertices as not visited
for ( int i = 0 ; i < V; i++ )
visited[ i] = false ;
// Call the recursive helper function to print all paths
// Note that we let cost = 0 since we don't have to move to the starting city
printAllPathsUtil( s, d, visited, path_costs, path, path_index, 0 ) ;
}
// A recursive function to print all paths from 'u' to 'd'.
// visited[] keeps track of vertices in current path.
// path[] stores actual vertices and path_index is current
// index in path[]
void Graph:: printAllPathsUtil ( int u, int d, bool visited[ ] , int path_costs[ ] ,
int path[ ] , int & path_index, int cost)
{
// Mark the current node and store it in path[]
visited[ u] = true ;
path[ path_index] = u;
path_costs[ path_index] = cost; // Save cost of this step
path_index++ ;
int sum = 0 ;
// If current vertex is same as destination, then print
// current path[]
if ( u == d) {
for ( int i = 0 ; i < path_index; i++ ) {
sum + = path_costs[ i] ; // Now add all the costs
cout << v1[ path[ i] ] << " " ;
}
cout << endl;
cout << "Total distance is: " << sum;
cout << endl;
}
else // If current vertex is not destination
{
// Recur for all the vertices adjacent to current vertex
// Now we loop over both adj and adj_weights
list< int > :: iterator i, j;
for ( i = adj[ u] .begin ( ) , j = adj_weights[ u] .begin ( ) ;
i ! = adj[ u] .end ( ) ; ++ i, ++ j)
if ( ! visited[ * i] )
printAllPathsUtil( * i, d, visited, path_costs, path,
path_index, * j) ;
}
// Remove current vertex from path[] and mark it as unvisited
path_index-- ;
visited[ u] = false ;
}
// Driver program
int main( )
{
// Create a graph given in the above diagram
Graph g( 7 ) ;
g.addEdge ( 0 , 1 , 1845 ) ;
g.addEdge ( 0 , 5 , 1264 ) ;
g.addEdge ( 1 , 3 , 7815 ) ;
g.addEdge ( 2 , 5 , 8132 ) ;
g.addEdge ( 2 , 6 , 11550 ) ;
g.addEdge ( 2 , 3 , 1303 ) ;
g.addEdge ( 3 , 4 , 5782 ) ;
g.addEdge ( 3 , 6 , 10838 ) ;
g.addEdge ( 4 , 2 , 4616 ) ;
g.addEdge ( 5 , 3 , 9566 ) ;
g.addEdge ( 6 , 5 , 5567 ) ;
int s = 0 , d = 2 ;
cout << "Following are all different paths from " << v1[ s] << " to " << v1[ d] << endl;
g.printAllPaths ( s, d) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdmVjdG9yIDxzdHJpbmc+IHYxID0geyJQcmFndWUiLCAiSGVsc2lua2kiLCAiQmVpamluZyIsICJUb2t5byIsICJKYWthcnRhIiwiTG9uZG9uIiwgIk5ldyBZb3JrIn07CnZlY3RvciA8aW50PiB3ID0ge307Ci8vIEEgZGlyZWN0ZWQgZ3JhcGggdXNpbmcKLy8gYWRqYWNlbmN5IGxpc3QgcmVwcmVzZW50YXRpb24KY2xhc3MgR3JhcGggewogICAgaW50IFY7IC8vIE5vLiBvZiB2ZXJ0aWNlcyBpbiBncmFwaAogICAgbGlzdDxpbnQ+KiBhZGo7IC8vIFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhZGphY2VuY3kgbGlzdHMKICAgIGxpc3Q8aW50PiogYWRqX3dlaWdodHM7IC8vIFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhZGphY2VuY3kgbGlzdHMKIAogICAgLy8gQSByZWN1cnNpdmUgZnVuY3Rpb24gdXNlZCBieSBwcmludEFsbFBhdGhzKCkKICAgIHZvaWQgcHJpbnRBbGxQYXRoc1V0aWwoaW50LCBpbnQsIGJvb2xbXSwgaW50W10sIGludFtdLCBpbnQmLCBpbnQpOwogCnB1YmxpYzoKICAgIEdyYXBoKGludCBWKTsgLy8gQ29uc3RydWN0b3IKICAgIHZvaWQgYWRkVmVydGV4KHN0cmluZyBuYW1lKTsKICAgIHZvaWQgYWRkRWRnZShpbnQgdSwgaW50IHYsIGludCB3ZWlnaHQpOwogICAgdm9pZCBwcmludEFsbFBhdGhzKGludCBzLCBpbnQgZCk7Cn07CiAKR3JhcGg6OkdyYXBoKGludCBWKQp7CiAgICB0aGlzLT5WID0gVjsKICAgIGFkaiA9IG5ldyBsaXN0PGludD5bVl07CiAgICBhZGpfd2VpZ2h0cyA9IG5ldyBsaXN0PGludD5bVl07Cn0Kdm9pZCBHcmFwaDo6YWRkRWRnZShpbnQgdSwgaW50IHYsIGludCB3ZWlnaHQpCnsKICAgIGFkalt1XS5wdXNoX2JhY2sodik7IC8vIEFkZCB2IHRvIHXigJlzIGxpc3QuCiAgICBhZGpfd2VpZ2h0c1t1XS5wdXNoX2JhY2sod2VpZ2h0KTsgLy8gQWRkIHRoZSB3ZWlnaHQgb2YgdGhlIHBhdGggYXMgd2VsbC4KfQogCi8vIFByaW50cyBhbGwgcGF0aHMgZnJvbSAncycgdG8gJ2QnCnZvaWQgR3JhcGg6OnByaW50QWxsUGF0aHMoaW50IHMsIGludCBkKQp7CiAgICAvLyBNYXJrIGFsbCB0aGUgdmVydGljZXMgYXMgbm90IHZpc2l0ZWQKICAgIGJvb2wqIHZpc2l0ZWQgPSBuZXcgYm9vbFtWXTsKICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBzdG9yZSBwYXRocwogICAgaW50KiBwYXRoID0gbmV3IGludFtWXTsKICAgIGludCogcGF0aF9jb3N0cyA9IG5ldyBpbnRbVl07CiAgICBpbnQgcGF0aF9pbmRleCA9IDA7IC8vIEluaXRpYWxpemUgcGF0aFtdIGFuZCBwYXRoX2Nvc3RzW10gYXMgZW1wdHkKIAogICAgLy8gSW5pdGlhbGl6ZSBhbGwgdmVydGljZXMgYXMgbm90IHZpc2l0ZWQKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVjsgaSsrKQogICAgICAgIHZpc2l0ZWRbaV0gPSBmYWxzZTsKIAogICAgLy8gQ2FsbCB0aGUgcmVjdXJzaXZlIGhlbHBlciBmdW5jdGlvbiB0byBwcmludCBhbGwgcGF0aHMKICAgIC8vIE5vdGUgdGhhdCB3ZSBsZXQgY29zdCA9IDAgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0byBtb3ZlIHRvIHRoZSBzdGFydGluZyBjaXR5CiAgICBwcmludEFsbFBhdGhzVXRpbChzLCBkLCB2aXNpdGVkLCBwYXRoX2Nvc3RzLCBwYXRoLCBwYXRoX2luZGV4LCAwKTsKfQogCi8vIEEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRvIHByaW50IGFsbCBwYXRocyBmcm9tICd1JyB0byAnZCcuCi8vIHZpc2l0ZWRbXSBrZWVwcyB0cmFjayBvZiB2ZXJ0aWNlcyBpbiBjdXJyZW50IHBhdGguCi8vIHBhdGhbXSBzdG9yZXMgYWN0dWFsIHZlcnRpY2VzIGFuZCBwYXRoX2luZGV4IGlzIGN1cnJlbnQKLy8gaW5kZXggaW4gcGF0aFtdCnZvaWQgR3JhcGg6OnByaW50QWxsUGF0aHNVdGlsKGludCB1LCBpbnQgZCwgYm9vbCB2aXNpdGVkW10sIGludCBwYXRoX2Nvc3RzW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXRoW10sIGludCYgcGF0aF9pbmRleCwgaW50IGNvc3QpCnsKICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgbm9kZSBhbmQgc3RvcmUgaXQgaW4gcGF0aFtdCiAgICB2aXNpdGVkW3VdID0gdHJ1ZTsKICAgIHBhdGhbcGF0aF9pbmRleF0gPSB1OwogICAgcGF0aF9jb3N0c1twYXRoX2luZGV4XSA9IGNvc3Q7ICAgLy8gU2F2ZSBjb3N0IG9mIHRoaXMgc3RlcAogICAgcGF0aF9pbmRleCsrOwogICAgaW50IHN1bSA9IDA7CiAgICAvLyBJZiBjdXJyZW50IHZlcnRleCBpcyBzYW1lIGFzIGRlc3RpbmF0aW9uLCB0aGVuIHByaW50CiAgICAvLyBjdXJyZW50IHBhdGhbXQogICAgaWYgKHUgPT0gZCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aF9pbmRleDsgaSsrKXsKICAgICAgICAgICAgc3VtICs9IHBhdGhfY29zdHNbaV07ICAgLy8gTm93IGFkZCBhbGwgdGhlIGNvc3RzCiAgICAgICAgICAgIGNvdXQgPDwgdjFbcGF0aFtpXV0gPDwgIiAiOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgY291dCA8PCAiVG90YWwgZGlzdGFuY2UgaXM6ICIgPDwgc3VtOwogICAgICAgIGNvdXQgPDwgZW5kbDsKICAgIH0KICAgIGVsc2UgLy8gSWYgY3VycmVudCB2ZXJ0ZXggaXMgbm90IGRlc3RpbmF0aW9uCiAgICB7CiAgICAgICAgLy8gUmVjdXIgZm9yIGFsbCB0aGUgdmVydGljZXMgYWRqYWNlbnQgdG8gY3VycmVudCB2ZXJ0ZXgKICAgICAgICAvLyBOb3cgd2UgbG9vcCBvdmVyIGJvdGggYWRqIGFuZCBhZGpfd2VpZ2h0cwogICAgICAgIGxpc3Q8aW50Pjo6aXRlcmF0b3IgaSwgajsKICAgICAgICBmb3IgKGkgPSBhZGpbdV0uYmVnaW4oKSwgaiA9IGFkal93ZWlnaHRzW3VdLmJlZ2luKCk7CiAgICAgICAgICAgICBpICE9IGFkalt1XS5lbmQoKTsgKytpLCArK2opCiAgICAgICAgICAgIGlmICghdmlzaXRlZFsqaV0pCiAgICAgICAgICAgICAgICBwcmludEFsbFBhdGhzVXRpbCgqaSwgZCwgdmlzaXRlZCwgcGF0aF9jb3N0cywgcGF0aCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2luZGV4LCAqaik7CiAgICB9CiAKICAgIC8vIFJlbW92ZSBjdXJyZW50IHZlcnRleCBmcm9tIHBhdGhbXSBhbmQgbWFyayBpdCBhcyB1bnZpc2l0ZWQKICAgIHBhdGhfaW5kZXgtLTsKICAgIHZpc2l0ZWRbdV0gPSBmYWxzZTsKfQogCi8vIERyaXZlciBwcm9ncmFtCmludCBtYWluKCkKewogICAgLy8gQ3JlYXRlIGEgZ3JhcGggZ2l2ZW4gaW4gdGhlIGFib3ZlIGRpYWdyYW0KICAgIEdyYXBoIGcoNyk7CiAgICAgICAKICAgIGcuYWRkRWRnZSgwLCAxLCAxODQ1KTsKICAgIGcuYWRkRWRnZSgwLCA1LCAxMjY0KTsKICAgIGcuYWRkRWRnZSgxLCAzLCA3ODE1KTsKICAgIGcuYWRkRWRnZSgyLCA1LCA4MTMyKTsgCiAgICBnLmFkZEVkZ2UoMiwgNiwgMTE1NTApOwogICAgZy5hZGRFZGdlKDIsIDMsIDEzMDMpOwogICAgZy5hZGRFZGdlKDMsIDQsIDU3ODIpOwogICAgZy5hZGRFZGdlKDMsIDYsIDEwODM4KTsKICAgIGcuYWRkRWRnZSg0LCAyLCA0NjE2KTsKICAgIGcuYWRkRWRnZSg1LCAzLCA5NTY2KTsKICAgIGcuYWRkRWRnZSg2LCA1LCA1NTY3KTsKICAgIGludCBzID0gMCwgZCA9IDI7CiAgICBjb3V0IDw8ICJGb2xsb3dpbmcgYXJlIGFsbCBkaWZmZXJlbnQgcGF0aHMgZnJvbSAiIDw8IHYxW3NdIDw8ICIgdG8gIiA8PCB2MVtkXSA8PCBlbmRsOwogICAgZy5wcmludEFsbFBhdGhzKHMsIGQpOwogCiAgICByZXR1cm4gMDsKCn0=