#include <iostream>
#include <vector>
using namespace std;
int currentTime = 0 ;
void dfsVisit( vector< vector< int >> & graph, vector< bool > & visited, vector< int > & discovery, vector< int > & finishing, int current) {
visited[ current] = true ;
discovery[ current] = ++ currentTime;
// Check if current node has an edge to other nodes and visit them if not visited yet
for ( int i = 0 ; i < graph[ current] .size ( ) ; ++ i) {
if ( graph[ current] [ i] == 1 && ! visited[ i] ) {
cout << "Node " << current << " -> " << i << " - " << currentTime << endl;
dfsVisit( graph, visited, discovery, finishing, i) ;
}
}
finishing[ current] = ++ currentTime;
}
void dfs( vector< vector< int >> & graph, vector< bool > & visited, vector< int > & discovery, vector< int > & finishing) {
for ( int i = 0 ; i < graph.size ( ) ; ++ i) {
if ( ! visited[ i] ) {
dfsVisit( graph, visited, discovery, finishing, i) ;
}
}
}
int main( ) {
int n; // number of nodes
cout << "Enter the number of nodes: " << endl;
cin >> n;
// defining the adjacency matrix
vector< vector< int >> graph( n, vector< int > ( n, 0 ) ) ;
// creating the adjacency matrix
cout << "Enter the adjacency matrix (1 if there's an edge, 0 otherwise):\n " ;
for ( int i = 0 ; i < n; ++ i) {
for ( int j = 0 ; j < n; ++ j)
cin >> graph[ i] [ j] ;
}
vector< bool > visited( n, false ) ;
vector< int > discovery( n, 0 ) ;
vector< int > finishing( n, 0 ) ;
cout << "DFS Traversal Sequence with Discovery and Finishing times: " << endl;
dfs( graph, visited, discovery, finishing) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGN1cnJlbnRUaW1lID0gMDsKCnZvaWQgZGZzVmlzaXQodmVjdG9yPHZlY3RvcjxpbnQ+PiYgZ3JhcGgsIHZlY3Rvcjxib29sPiYgdmlzaXRlZCwgdmVjdG9yPGludD4mIGRpc2NvdmVyeSwgdmVjdG9yPGludD4mIGZpbmlzaGluZywgaW50IGN1cnJlbnQpIHsKICAgIHZpc2l0ZWRbY3VycmVudF0gPSB0cnVlOwogICAgZGlzY292ZXJ5W2N1cnJlbnRdID0gKytjdXJyZW50VGltZTsKCiAgICAvLyBDaGVjayBpZiBjdXJyZW50IG5vZGUgaGFzIGFuIGVkZ2UgdG8gb3RoZXIgbm9kZXMgYW5kIHZpc2l0IHRoZW0gaWYgbm90IHZpc2l0ZWQgeWV0CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyYXBoW2N1cnJlbnRdLnNpemUoKTsgKytpKSB7CiAgICAgICAgaWYgKGdyYXBoW2N1cnJlbnRdW2ldID09IDEgJiYgIXZpc2l0ZWRbaV0pIHsKICAgICAgICAgICAgY291dCA8PCAiTm9kZSAiIDw8IGN1cnJlbnQgPDwgIiAtPiAiIDw8IGkgPDwgIiAtICIgPDwgY3VycmVudFRpbWUgPDwgZW5kbDsKICAgICAgICAgICAgZGZzVmlzaXQoZ3JhcGgsIHZpc2l0ZWQsIGRpc2NvdmVyeSwgZmluaXNoaW5nLCBpKTsKICAgICAgICB9CiAgICB9CgogICAgZmluaXNoaW5nW2N1cnJlbnRdID0gKytjdXJyZW50VGltZTsKfQoKdm9pZCBkZnModmVjdG9yPHZlY3RvcjxpbnQ+PiYgZ3JhcGgsIHZlY3Rvcjxib29sPiYgdmlzaXRlZCwgdmVjdG9yPGludD4mIGRpc2NvdmVyeSwgdmVjdG9yPGludD4mIGZpbmlzaGluZykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmFwaC5zaXplKCk7ICsraSkgewogICAgICAgIGlmICghdmlzaXRlZFtpXSkgewogICAgICAgICAgICBkZnNWaXNpdChncmFwaCwgdmlzaXRlZCwgZGlzY292ZXJ5LCBmaW5pc2hpbmcsIGkpOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbjsgLy8gbnVtYmVyIG9mIG5vZGVzCiAgICBjb3V0IDw8ICJFbnRlciB0aGUgbnVtYmVyIG9mIG5vZGVzOiAiIDw8IGVuZGw7CiAgICBjaW4gPj4gbjsKCiAgICAvLyBkZWZpbmluZyB0aGUgYWRqYWNlbmN5IG1hdHJpeAogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBncmFwaChuLCB2ZWN0b3I8aW50PihuLCAwKSk7CgogICAgLy8gY3JlYXRpbmcgdGhlIGFkamFjZW5jeSBtYXRyaXgKICAgIGNvdXQgPDwgIkVudGVyIHRoZSBhZGphY2VuY3kgbWF0cml4ICgxIGlmIHRoZXJlJ3MgYW4gZWRnZSwgMCBvdGhlcndpc2UpOlxuIjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opCiAgICAgICAgICAgIGNpbiA+PiBncmFwaFtpXVtqXTsKICAgIH0KCiAgICB2ZWN0b3I8Ym9vbD4gdmlzaXRlZChuLCBmYWxzZSk7CiAgICB2ZWN0b3I8aW50PiBkaXNjb3ZlcnkobiwgMCk7CiAgICB2ZWN0b3I8aW50PiBmaW5pc2hpbmcobiwgMCk7CgogICAgY291dCA8PCAiREZTIFRyYXZlcnNhbCBTZXF1ZW5jZSB3aXRoIERpc2NvdmVyeSBhbmQgRmluaXNoaW5nIHRpbWVzOiAiIDw8IGVuZGw7CiAgICBkZnMoZ3JhcGgsIHZpc2l0ZWQsIGRpc2NvdmVyeSwgZmluaXNoaW5nKTsKCiAgICByZXR1cm4gMDsKfQo=