#include<stdlib.h>
#include<stdio.h>
#include<list>
#include<iostream>
using namespace std;
struct graph{
int V;
list<int> *adj;
};
struct graph* create(int v){
struct graph* g= (struct graph* )malloc(sizeof(struct graph));
g->V=v;
g->adj=new list<int>[v];
return g;
}
void addEdge(struct graph* g,int w,int e){
g->adj[w].push_back(e);
}
bool dfs_visit(struct graph* g,int j,char* color){
color[j]='g';
//printf("%d ",j);
list<int>::iterator k;
for(k=g->adj[j].begin();k!=g->adj[j].end();k++){
if(color[*k]=='g')
return true;
if(color[*k]=='w'){
return dfs_visit(g,*k,color);
}
}
// printf("hello\n");
color[j]='b';
return false;
}
bool dfs(struct graph* g){
char color[g->V];
for(int i=0;i<g->V;i++)
color[i]='w';
color[0]='g';
list<int>::iterator j;
for(int i=0;i<g->V;i++){
for(j=g->adj[i].begin();j!=g->adj[i].end();j++){
if(color[*j]=='w'){
bool l=dfs_visit(g,*j,color);
if(l)
return true;
}
}
}
return false;
}
int main(){
struct graph* g=create(5);
addEdge(g,0, 1);
addEdge(g,0, 2);
addEdge(g,1, 2);
addEdge(g,2,3);
addEdge(g,3,0);
// addEdge(g,2, 0);
//addEdge(g,2, 3);
// addEdge(g,3, 3);
if(dfs(g))
printf("tree is cyclic\n");
else
printf("tree is not cyclic\n");
}
I2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPGxpc3Q+CiNpbmNsdWRlPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgZ3JhcGh7CglpbnQgVjsKCWxpc3Q8aW50PiAqYWRqOwp9OwpzdHJ1Y3QgZ3JhcGgqIGNyZWF0ZShpbnQgdil7CglzdHJ1Y3QgZ3JhcGgqIGc9IChzdHJ1Y3QgZ3JhcGgqICltYWxsb2Moc2l6ZW9mKHN0cnVjdCBncmFwaCkpOwoJZy0+Vj12OwoJZy0+YWRqPW5ldyBsaXN0PGludD5bdl07CglyZXR1cm4gZzsKCQp9CnZvaWQgYWRkRWRnZShzdHJ1Y3QgZ3JhcGgqIGcsaW50IHcsaW50IGUpewoJZy0+YWRqW3ddLnB1c2hfYmFjayhlKTsKCQp9CmJvb2wgZGZzX3Zpc2l0KHN0cnVjdCBncmFwaCogZyxpbnQgaixjaGFyKiBjb2xvcil7CgkKCWNvbG9yW2pdPSdnJzsKCS8vcHJpbnRmKCIlZCAiLGopOwoJbGlzdDxpbnQ+OjppdGVyYXRvciBrOwoJZm9yKGs9Zy0+YWRqW2pdLmJlZ2luKCk7ayE9Zy0+YWRqW2pdLmVuZCgpO2srKyl7CgkJCgkJaWYoY29sb3JbKmtdPT0nZycpCgkJcmV0dXJuIHRydWU7CgkJaWYoY29sb3JbKmtdPT0ndycpewoJCQkKCQkJcmV0dXJuIGRmc192aXNpdChnLCprLGNvbG9yKTsKCQl9Cgl9Ci8vCXByaW50ZigiaGVsbG9cbiIpOwoJY29sb3Jbal09J2InOwoJcmV0dXJuIGZhbHNlOwp9CmJvb2wgZGZzKHN0cnVjdCBncmFwaCogZyl7CgljaGFyIGNvbG9yW2ctPlZdOwoJZm9yKGludCBpPTA7aTxnLT5WO2krKykKCWNvbG9yW2ldPSd3JzsKCWNvbG9yWzBdPSdnJzsKCWxpc3Q8aW50Pjo6aXRlcmF0b3IgajsKCWZvcihpbnQgaT0wO2k8Zy0+VjtpKyspewoJCWZvcihqPWctPmFkaltpXS5iZWdpbigpO2ohPWctPmFkaltpXS5lbmQoKTtqKyspewoJCQkKCQkJaWYoY29sb3JbKmpdPT0ndycpewoJCQkJCgkJCQlib29sIGw9ZGZzX3Zpc2l0KGcsKmosY29sb3IpOwoJCQkJaWYobCkKCQkJCXJldHVybiB0cnVlOwoJCQkKCQkJfQoJCX0KCQkKCX0KCXJldHVybiBmYWxzZTsKCQp9CmludCBtYWluKCl7CglzdHJ1Y3QgZ3JhcGgqIGc9Y3JlYXRlKDUpOwoJCgkgYWRkRWRnZShnLDAsIDEpOwogICAgYWRkRWRnZShnLDAsIDIpOwogICAgYWRkRWRnZShnLDEsIDIpOwogICAgYWRkRWRnZShnLDIsMyk7CiAgICBhZGRFZGdlKGcsMywwKTsKICAgLy8gYWRkRWRnZShnLDIsIDApOwogICAgLy9hZGRFZGdlKGcsMiwgMyk7CiAgIC8vIGFkZEVkZ2UoZywzLCAzKTsKICAgIGlmKGRmcyhnKSkKICAgIHByaW50ZigidHJlZSBpcyBjeWNsaWNcbiIpOwogICAgZWxzZQogICAgcHJpbnRmKCJ0cmVlIGlzIG5vdCBjeWNsaWNcbiIpOwoJCn0=