#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#define R(t) scanf("%d",&t)
#define W(t) printf("%d ",t)
#define rep(i,x,y) for(i=x;i<y;i++)
typedef struct adjnode
{
int x;
struct adjnode *next;
}node;
typedef struct adjlist
{
node *head;
}list;
typedef struct graph
{
int V;
list *neighbors;
}graph;
typedef struct stack
{
int x;
struct stack *next;
}stack;
stack *top;
stack* push(int x)
{
if(!top)
{
top
=(stack
*)malloc(sizeof(stack
)); top->next=NULL;
top->x=x;
}
else
{
stack
*temp
=(stack
*)malloc(sizeof(stack
)); temp->next=top;
temp->x=x;
top=temp;
}
return top;
}
int stktop()
{
return top->x;
}
int isEmpty()
{
return !top?1:0;
}
int pop()
{
if(top->next!=NULL)
{
int y=top->x;
stack* temp=top;
top=top->next;
//free(temp);
return y;
}
else
{
int y=top->x;
//free(top);
return y;
}
}
int *visited,*arrival,*departure;
graph* CreateGraph(int V)
{
graph
*g
=(graph
*)malloc(sizeof(graph
)); g->V=V;
g
->neighbors
=(list
*)malloc(sizeof(list
)*V
); int i;
rep(i,0,V)
g->neighbors[i].head=NULL;
return g;
}
node* New_Node(int val)
{
node
* temp
=(node
*)malloc(sizeof(node
)); temp->next=NULL;
temp->x=val;
return temp;
}
void AddEdge(graph *g,int i,int j)
{
node* t1=New_Node(i);
t1->next=g->neighbors[j].head;
g->neighbors[j].head=t1;
node* t2=New_Node(j);
t2->next=g->neighbors[i].head;
g->neighbors[i].head=t2;
}
int t=0;
void DFS(graph* g,int v)
{
push(v);
while(!isEmpty())
{
int x=stktop();
arrival[x]=t++;
pop();
if(!visited[x])
{
visited[x]=1;
node *temp=g->neighbors[x].head;
while(temp)
{
if(!visited[temp->x])
push(temp->x);
temp=temp->next;
}
}
departure[x]=t++;
}
}
int TreeEdge(int a,int b)
{
if(arrival[a]<arrival[b] && arrival[b]<departure[b] && departure[b]<departure[a]) return 1;
else return 0;
}
int BackEdge(int a,int b)
{
if(arrival[b]<=arrival[a] && arrival[a]<departure[a] && departure[a]<=departure[b]) return 1;
else return 0;
}
int main()
{
graph *g =CreateGraph(10);
departure
=(int*)calloc(10,sizeof(int)); arrival
=(int*)calloc(10,sizeof(int)); visited
=(int*)calloc(10,sizeof(int)); AddEdge(g,0,2);
AddEdge(g,0,1);
AddEdge(g,1,4);
AddEdge(g,3,4);
AddEdge(g,3,5);
AddEdge(g,4,5);
AddEdge(g,5,6);
AddEdge(g,6,7);
AddEdge(g,6,8);
DFS(g,0);
int i;
for(i=0;i<g->V;i++)
{
printf("%d :[%d,%d]\n",i
,arrival
[i
],departure
[i
]); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2RlZmluZSBSKHQpIHNjYW5mKCIlZCIsJnQpCiNkZWZpbmUgVyh0KSBwcmludGYoIiVkICIsdCkKI2RlZmluZSByZXAoaSx4LHkpIGZvcihpPXg7aTx5O2krKykKCnR5cGVkZWYgc3RydWN0IGFkam5vZGUKewoJaW50IHg7CglzdHJ1Y3QgYWRqbm9kZSAqbmV4dDsKfW5vZGU7Cgp0eXBlZGVmIHN0cnVjdCBhZGpsaXN0CnsKCW5vZGUgKmhlYWQ7Cn1saXN0OwoKdHlwZWRlZiBzdHJ1Y3QgZ3JhcGgKewoJaW50IFY7CglsaXN0ICpuZWlnaGJvcnM7Cn1ncmFwaDsKCnR5cGVkZWYgc3RydWN0IHN0YWNrCnsKCWludCB4OwoJc3RydWN0IHN0YWNrICpuZXh0Owp9c3RhY2s7CgpzdGFjayAqdG9wOwoKc3RhY2sqIHB1c2goaW50IHgpCnsKCWlmKCF0b3ApCgl7CgkJdG9wPShzdGFjayopbWFsbG9jKHNpemVvZihzdGFjaykpOwoJCXRvcC0+bmV4dD1OVUxMOwoJCXRvcC0+eD14OwoJfQoJZWxzZQoJewoJCXN0YWNrICp0ZW1wPShzdGFjayopbWFsbG9jKHNpemVvZihzdGFjaykpOwoJCXRlbXAtPm5leHQ9dG9wOwoJCXRlbXAtPng9eDsKCQl0b3A9dGVtcDsKCX0KCXJldHVybiB0b3A7Cn0KCmludCBzdGt0b3AoKQp7CglyZXR1cm4gdG9wLT54Owp9CgppbnQgaXNFbXB0eSgpCnsKCXJldHVybiAhdG9wPzE6MDsKfQoKaW50IHBvcCgpCnsKCWlmKHRvcC0+bmV4dCE9TlVMTCkKCXsKCQlpbnQgeT10b3AtPng7CgkJc3RhY2sqIHRlbXA9dG9wOwoJCXRvcD10b3AtPm5leHQ7CgkJLy9mcmVlKHRlbXApOwoJCXJldHVybiB5OwoJfQoJZWxzZQoJewoJCWludCB5PXRvcC0+eDsKCQkvL2ZyZWUodG9wKTsKCQlyZXR1cm4geTsKCX0KfQoKaW50ICp2aXNpdGVkLCphcnJpdmFsLCpkZXBhcnR1cmU7CgpncmFwaCogQ3JlYXRlR3JhcGgoaW50IFYpCnsKCWdyYXBoICpnPShncmFwaCopbWFsbG9jKHNpemVvZihncmFwaCkpOwoJZy0+Vj1WOwoJZy0+bmVpZ2hib3JzPShsaXN0KiltYWxsb2Moc2l6ZW9mKGxpc3QpKlYpOwoJaW50IGk7CglyZXAoaSwwLFYpCgkJZy0+bmVpZ2hib3JzW2ldLmhlYWQ9TlVMTDsKCXJldHVybiBnOwp9Cgpub2RlKiBOZXdfTm9kZShpbnQgdmFsKQp7Cglub2RlKiB0ZW1wPShub2RlKiltYWxsb2Moc2l6ZW9mKG5vZGUpKTsKCXRlbXAtPm5leHQ9TlVMTDsKCXRlbXAtPng9dmFsOwoJcmV0dXJuIHRlbXA7Cn0KCnZvaWQgQWRkRWRnZShncmFwaCAqZyxpbnQgaSxpbnQgaikKewoJbm9kZSogdDE9TmV3X05vZGUoaSk7Cgl0MS0+bmV4dD1nLT5uZWlnaGJvcnNbal0uaGVhZDsKCWctPm5laWdoYm9yc1tqXS5oZWFkPXQxOwoKCW5vZGUqIHQyPU5ld19Ob2RlKGopOwoJdDItPm5leHQ9Zy0+bmVpZ2hib3JzW2ldLmhlYWQ7CglnLT5uZWlnaGJvcnNbaV0uaGVhZD10MjsKfQoKaW50IHQ9MDsKCnZvaWQgREZTKGdyYXBoKiBnLGludCB2KQp7CglwdXNoKHYpOwoJd2hpbGUoIWlzRW1wdHkoKSkKCXsKCQlpbnQgeD1zdGt0b3AoKTsKCQlhcnJpdmFsW3hdPXQrKzsKCQlwb3AoKTsKCQlpZighdmlzaXRlZFt4XSkKCQl7CgkJCXZpc2l0ZWRbeF09MTsKCQkJbm9kZSAqdGVtcD1nLT5uZWlnaGJvcnNbeF0uaGVhZDsKCQkJd2hpbGUodGVtcCkKCQkJewoJCQkJaWYoIXZpc2l0ZWRbdGVtcC0+eF0pCgkJCQkJcHVzaCh0ZW1wLT54KTsKCQkJCXRlbXA9dGVtcC0+bmV4dDsKCQkJfQoJCX0KCQlkZXBhcnR1cmVbeF09dCsrOwoJfQp9CgppbnQgVHJlZUVkZ2UoaW50IGEsaW50IGIpCnsKCWlmKGFycml2YWxbYV08YXJyaXZhbFtiXSAmJiBhcnJpdmFsW2JdPGRlcGFydHVyZVtiXSAmJiBkZXBhcnR1cmVbYl08ZGVwYXJ0dXJlW2FdKSByZXR1cm4gMTsKCWVsc2UgcmV0dXJuIDA7Cn0KCmludCBCYWNrRWRnZShpbnQgYSxpbnQgYikKewoJaWYoYXJyaXZhbFtiXTw9YXJyaXZhbFthXSAmJiBhcnJpdmFsW2FdPGRlcGFydHVyZVthXSAmJiBkZXBhcnR1cmVbYV08PWRlcGFydHVyZVtiXSkgcmV0dXJuIDE7CgllbHNlIHJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKCWdyYXBoICpnID1DcmVhdGVHcmFwaCgxMCk7CglkZXBhcnR1cmU9KGludCopY2FsbG9jKDEwLHNpemVvZihpbnQpKTsKCWFycml2YWw9KGludCopY2FsbG9jKDEwLHNpemVvZihpbnQpKTsKCXZpc2l0ZWQ9KGludCopY2FsbG9jKDEwLHNpemVvZihpbnQpKTsKCUFkZEVkZ2UoZywwLDIpOwoJQWRkRWRnZShnLDAsMSk7CglBZGRFZGdlKGcsMSw0KTsKCUFkZEVkZ2UoZywzLDQpOwoJQWRkRWRnZShnLDMsNSk7CglBZGRFZGdlKGcsNCw1KTsKCUFkZEVkZ2UoZyw1LDYpOwoJQWRkRWRnZShnLDYsNyk7CglBZGRFZGdlKGcsNiw4KTsKCURGUyhnLDApOwoJaW50IGk7Cglmb3IoaT0wO2k8Zy0+VjtpKyspCgl7CgkJcHJpbnRmKCIlZCA6WyVkLCVkXVxuIixpLGFycml2YWxbaV0sZGVwYXJ0dXJlW2ldKTsKCX0KCXJldHVybiAwOwp9