#include<stdio.h>
struct node
{
int val;
struct node* next;
};
struct graph
{
int V;
struct node **array;
};
struct graph *createGraph(int v)
{
struct graph
*G
= (struct graph
*)malloc(sizeof(struct graph
));
G->V=v;
G
->array
= (struct node
**)malloc(v
*sizeof(struct node
*));
int i=0;
for(i=0;i<v;i++)
{
G->array[i]=NULL;
}
return G;
}
void insertEdge(struct graph *G, int v1, int v2)
{
struct node *temp = G->array[v1];
struct node
*newNode
= (struct node
*)malloc(sizeof(struct node
)); newNode->val=v2;
newNode->next=temp;
G->array[v1]= newNode;
}
void printAdjacencyList(struct graph *G)
{
int i;
struct node *temp;
for(i=0;i<G->V;i++)
{
temp=G->array[i];
while(temp)
{
temp=temp->next;
}
}
}
void dfsEdges(struct graph*G, int v, int *visited, int *arrTime, int *depTime)
{
visited[v]=1;
//printf("%d ",v);
struct node *temp = G->array[v];
while(temp!=NULL)
{
if(visited[temp->val] != 1)
{
dfsEdges(G,temp->val,visited,arrTime,depTime);
}
else
{
/*
If we visit a node already visited and we have not yet departed from that node, than it
makes a back edge.
Else, there are two possibilities - cross edge or forward edge. In both these cases we visit a
node fron which we have alredy departed. So here, we can distinguish between them using the arrival time.
If it is a forward edge (going from ancestor to descendent, u -> v), arrival time of u will be less v and if it is
cross edge, arrival time of u will be greater than v
*/
if(depTime[temp->val] ==-1)
printf("\n%d - %d is back edge\n",v
,temp
->val
); else
{
if(arrTime[v]<arrTime[temp->val])
printf("\n%d - %d is forward edge\n",v
,temp
->val
); else
printf("\n%d - %d is cross edge\n",v
,temp
->val
); }
}
temp=temp->next;
}
}
int main()
{
struct graph *G = createGraph(6);
insertEdge(G, 0, 3);
insertEdge(G, 0, 2);
insertEdge(G, 1, 0);
insertEdge(G, 1, 3);
insertEdge(G, 2, 3);
insertEdge(G, 2, 4);
insertEdge(G, 3, 5);
insertEdge(G, 4, 0);
insertEdge(G, 5, 4);
printAdjacencyList(G);
int *visited
= (int*)malloc(G
->V
* sizeof(int)); int *arrTime
= (int*)malloc(G
->V
* sizeof(int)); int *depTime
= (int*)malloc(G
->V
* sizeof(int)); int *parent
= (int*)malloc(G
->V
* sizeof(int));
int i;
/*
for(i=0;i<G->V;i++)
{
if(visited[i]!=1)
dfs(G,i,visited);
}
*/
for(i=0;i<G->V;i++)
arrTime[i]=-1;
for(i=0;i<G->V;i++)
visited[i]=0;
for(i=0;i<G->V;i++)
depTime[i]=-1;
for(i=0;i<G->V;i++)
{
if(visited[i]!=1)
dfsEdges(G,i,visited,arrTime,depTime);
}
for(i=0;i<G->V;i++)
for(i=0;i<G->V;i++)
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KCnN0cnVjdCBub2RlCnsKCQoJaW50IHZhbDsKCXN0cnVjdCBub2RlKiBuZXh0OwoJCn07CgpzdHJ1Y3QgZ3JhcGgKewoJCglpbnQgVjsKCXN0cnVjdCBub2RlICoqYXJyYXk7CQoJCQp9OwoKc3RydWN0IGdyYXBoICpjcmVhdGVHcmFwaChpbnQgdikKewoJCglzdHJ1Y3QgZ3JhcGggKkc9IChzdHJ1Y3QgZ3JhcGgqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGdyYXBoKSk7CgkKCUctPlY9djsKCUctPmFycmF5ID0gKHN0cnVjdCBub2RlICoqKW1hbGxvYyh2KnNpemVvZihzdHJ1Y3Qgbm9kZSopKTsKCQoJaW50IGk9MDsKCWZvcihpPTA7aTx2O2krKykKCXsKCQlHLT5hcnJheVtpXT1OVUxMOwoJfQoJCglyZXR1cm4gRzsJCgkKfQp2b2lkIGluc2VydEVkZ2Uoc3RydWN0IGdyYXBoICpHLCBpbnQgdjEsIGludCB2MikKewoJCglzdHJ1Y3Qgbm9kZSAqdGVtcCA9IEctPmFycmF5W3YxXTsKCQoJc3RydWN0IG5vZGUgKm5ld05vZGUgPSAoc3RydWN0IG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKCW5ld05vZGUtPnZhbD12MjsKCW5ld05vZGUtPm5leHQ9dGVtcDsKCQoJRy0+YXJyYXlbdjFdPSBuZXdOb2RlOwoJCgkKfQp2b2lkIHByaW50QWRqYWNlbmN5TGlzdChzdHJ1Y3QgZ3JhcGggKkcpCnsKCQoJaW50IGk7CglzdHJ1Y3Qgbm9kZSAqdGVtcDsKCWZvcihpPTA7aTxHLT5WO2krKykKCXsKCQlwcmludGYoIiVkIDogIixpKTsKCQl0ZW1wPUctPmFycmF5W2ldOwoJCXdoaWxlKHRlbXApCgkJewoJCQlwcmludGYoIiVkICIsdGVtcC0+dmFsKTsKCQkJdGVtcD10ZW1wLT5uZXh0OwoJCX0KCQlwcmludGYoIlxuIik7Cgl9CgkKfQoKdm9pZCBkZnNFZGdlcyhzdHJ1Y3QgZ3JhcGgqRywgaW50IHYsIGludCAqdmlzaXRlZCwgaW50ICphcnJUaW1lLCBpbnQgKmRlcFRpbWUpCnsKCXN0YXRpYyBpbnQgdGltZT0wOwoJCgkKCXZpc2l0ZWRbdl09MTsKCWFyclRpbWVbdl09dGltZSsrOwoJLy9wcmludGYoIiVkICIsdik7CgkKCXN0cnVjdCBub2RlICp0ZW1wID0gRy0+YXJyYXlbdl07Cgl3aGlsZSh0ZW1wIT1OVUxMKQoJewoJCWlmKHZpc2l0ZWRbdGVtcC0+dmFsXSAhPSAxKQoJCXsKCQkJZGZzRWRnZXMoRyx0ZW1wLT52YWwsdmlzaXRlZCxhcnJUaW1lLGRlcFRpbWUpOwoJCX0KCQllbHNlCgkJewoJCQkvKiAKCQkJSWYgd2UgdmlzaXQgYSBub2RlIGFscmVhZHkgdmlzaXRlZCBhbmQgd2UgaGF2ZSBub3QgeWV0IGRlcGFydGVkIGZyb20gdGhhdCBub2RlLCB0aGFuIGl0IAoJCQltYWtlcyBhIGJhY2sgZWRnZS4KCQkJCgkJCUVsc2UsIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllcyAtIGNyb3NzIGVkZ2Ugb3IgZm9yd2FyZCBlZGdlLiBJbiBib3RoIHRoZXNlIGNhc2VzIHdlIHZpc2l0IGEKCQkJbm9kZSBmcm9uIHdoaWNoIHdlIGhhdmUgYWxyZWR5IGRlcGFydGVkLiBTbyBoZXJlLCB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIHVzaW5nIHRoZSBhcnJpdmFsIHRpbWUuCgkJCUlmIGl0IGlzIGEgZm9yd2FyZCBlZGdlIChnb2luZyBmcm9tIGFuY2VzdG9yIHRvIGRlc2NlbmRlbnQsIHUgLT4gdiksIGFycml2YWwgdGltZSBvZiB1IHdpbGwgYmUgbGVzcyB2IGFuZCBpZiBpdCBpcyAKCQkJY3Jvc3MgZWRnZSwgYXJyaXZhbCB0aW1lIG9mIHUgd2lsbCBiZSBncmVhdGVyIHRoYW4gdgoJCQkqLwoJCQlpZihkZXBUaW1lW3RlbXAtPnZhbF0gPT0tMSkKCQkJcHJpbnRmKCJcbiVkIC0gJWQgaXMgYmFjayBlZGdlXG4iLHYsdGVtcC0+dmFsKTsKCQkJZWxzZQoJCQl7CgkJCQlpZihhcnJUaW1lW3ZdPGFyclRpbWVbdGVtcC0+dmFsXSkKCQkJCXByaW50ZigiXG4lZCAtICVkIGlzIGZvcndhcmQgZWRnZVxuIix2LHRlbXAtPnZhbCk7CgkJCQllbHNlCgkJCQlwcmludGYoIlxuJWQgLSAlZCBpcyBjcm9zcyBlZGdlXG4iLHYsdGVtcC0+dmFsKTsKCQkJfQoJCQkKCQl9CgkJdGVtcD10ZW1wLT5uZXh0OwoJCQoJfQoJZGVwVGltZVt2XT10aW1lKys7CgkKfQoKaW50IG1haW4oKQp7CglzdHJ1Y3QgZ3JhcGggKkcgPSBjcmVhdGVHcmFwaCg2KTsKCglpbnNlcnRFZGdlKEcsIDAsIDMpOwogICAgaW5zZXJ0RWRnZShHLCAwLCAyKTsJCglpbnNlcnRFZGdlKEcsIDEsIDApOwogICAgaW5zZXJ0RWRnZShHLCAxLCAzKTsKICAgCWluc2VydEVkZ2UoRywgMiwgMyk7CiAgICBpbnNlcnRFZGdlKEcsIDIsIDQpOwogICAgaW5zZXJ0RWRnZShHLCAzLCA1KTsKICAgIGluc2VydEVkZ2UoRywgNCwgMCk7CQogICAgaW5zZXJ0RWRnZShHLCA1LCA0KTsKCQoJCglwcmludEFkamFjZW5jeUxpc3QoRyk7CgkKCgkKCXByaW50ZigiXG5ERlM6XG4iKTsKCWludCAqdmlzaXRlZCA9IChpbnQqKW1hbGxvYyhHLT5WICogc2l6ZW9mKGludCkpOwoJaW50ICphcnJUaW1lID0gKGludCopbWFsbG9jKEctPlYgKiBzaXplb2YoaW50KSk7CglpbnQgKmRlcFRpbWUgPSAoaW50KiltYWxsb2MoRy0+ViAqIHNpemVvZihpbnQpKTsKCWludCAqcGFyZW50ID0gKGludCopbWFsbG9jKEctPlYgKiBzaXplb2YoaW50KSk7CgkJCglpbnQgaTsKCQoJLyoKCWZvcihpPTA7aTxHLT5WO2krKykKCXsKCQlpZih2aXNpdGVkW2ldIT0xKQoJCWRmcyhHLGksdmlzaXRlZCk7Cgl9CgkqLwoJCglmb3IoaT0wO2k8Ry0+VjtpKyspCglhcnJUaW1lW2ldPS0xOwoJZm9yKGk9MDtpPEctPlY7aSsrKQoJdmlzaXRlZFtpXT0wOwoJZm9yKGk9MDtpPEctPlY7aSsrKQoJZGVwVGltZVtpXT0tMTsKCQoJZm9yKGk9MDtpPEctPlY7aSsrKQoJewoJCWlmKHZpc2l0ZWRbaV0hPTEpCgkJZGZzRWRnZXMoRyxpLHZpc2l0ZWQsYXJyVGltZSxkZXBUaW1lKTsKCX0KCQoJcHJpbnRmKCJcbiIpOwoJcHJpbnRmKCJcbkFycml2YWwgVGltZVxuIik7Cglmb3IoaT0wO2k8Ry0+VjtpKyspCglwcmludGYoIiVkICIsYXJyVGltZVtpXSk7CgoJcHJpbnRmKCJcbkRlcGFydHVyZSBUaW1lXG4iKTsJCglmb3IoaT0wO2k8Ry0+VjtpKyspCglwcmludGYoIiVkICIsZGVwVGltZVtpXSk7CgkKCXByaW50ZigiXG4iKTsKCglyZXR1cm4gMDsKfQo=