#include <iostream>
#include <map>
#include <set>
using namespace std;
int timed;
map<int,int> d;
map<int,int> f;
map<int,int> preceed;
map<int, string> color;
set<int> vertex;
void dfs(map<int, int> G);
void dfs_visit(int u, set<int> vertices, map<int,int> m);
void display();
int main()
{
map<int , int> m;
m[1] = 2;
m[1] = 4;
m[2] = 5;
m[5] = 4;
m[4] = 2;
m[3] = 5;
m[3] = 6;
m[6] = 6;
dfs(m);
display();
cout<<timed;
return 0;
}
void dfs( map<int, int> m)
{
map<int , int> :: iterator it;
set<int> vertices;
set<int> :: iterator vit;
for(it = m.begin(); it != m.end(); it++) {
vertices.insert((*it).first);
vertices.insert((*it).second);
color[(*it).first] = "white";
color[(*it).second] = "white";
}
vertex = vertices;
timed = 0;
for(vit = vertices.begin(); vit != vertices.end(); vit++) {
if(color[*vit] == "white") {
dfs_visit(*vit, vertices, m);
}
}
}
void dfs_visit(int u, set<int> vertices, map<int,int> m)
{
set<int> :: iterator vit;
color[u] = "gray";
timed+=1;
d[u] = timed;
for(vit = vertices.begin(); vit!=vertices.end(); vit++) {
if( m[u] == *vit && color[*vit] == "white") {
preceed[*vit] = u;
dfs_visit(*vit, vertices, m);
}
}
color[u] = "black";
timed+=1;
f[u] = timed+1;
}
void display()
{
set<int> :: iterator it;
for(it = vertex.begin(); it!=vertex.end(); it++) {
cout<<"discovery time of: "<<*it<<" is: "<<d[*it]<<", finish time: "<<f[*it]<<"\n";
}
}