KIỂM TRA CHU TRÌNH

 KIỂM TRA CHU TRÌNH





//Duyet Graph queue

#include<stdio.h>
#define N 500
#define trang 0
#define den 1
#define xam 2
typedef struct{
	int n;
	int A[N][N];
}Graph;
// Khoi tao do thi vo huong khong khuyen
void init_graph(Graph *G, int n){
	G->n=n;
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			G->A[i][j]=0;
}
void add_graph(Graph *G, int x, int y){
	G->A[x][y]=1;
//	G->A[y][x]=1;
}
int adjacent(Graph *G, int x, int y){
	return G->A[x][y]!=0;
}
int degree(Graph *G, int x){
	int deg = 0,i;
	for(i=1;i<=G->n;i++)
		if(G->A[x][i]!=0)
			deg++;
	return deg;
}
typedef int ElementType;
typedef struct{
	ElementType data[500];
	int size;
}List;
//Khoi tao danh sach list
void make_list_null(List *L){
	L->size=0;
}
void push_list(List *L, int x){
	L->data[L->size]=x;
	L->size++;
}
ElementType element_at_list(List* L, int i) {
    return L->data[i-1];
}
int count_list(List* L) {
    return L->size;
}
int empty_list(List *L)
{
    return L->size == 0;
}

List neighbors(Graph *G, int x){
	List L;
	make_list_null(&L);
	int i;
	for(i=1;i<=G->n;i++){
		if(adjacent(G,x,i))
			push_list(&L,i);
	}
	return L;
}
int color[100];
int cycle;
int chutrinh(Graph *G, int x, int parent){
	color[x]=xam;
	int i;
	List L = neighbors(G,x);
	for(i=0;i<L.size;i++){
		if(L.data[i]== parent)
			continue;
		if(color[L.data[i]]==xam){
			cycle=1;
			return;
		}
		if(color[L.data[i]]==trang)
			chutrinh(G,L.data[i],parent);
	}
	color[x]=den;
}
int contaisn_cycle(Graph *G){
	int i;
	for(i=1;i<=G->n;i++){
		color[i]=trang;
	}
	cycle=0;
	for(i=1;i<=G->n;i++)
		if(color[i]==trang)
			chutrinh(G,i,0);
	return cycle;
}
int main(){
	Graph G;
	int n,i,m,j;
	int u,v;
	freopen("dt.txt","r",stdin);
	scanf("%d%d",&n,&m);
	init_graph(&G,n);
	for(i=0;i<m;i++){
			scanf("%d%d",&u,&v);
			add_graph(&G,u,v);
		}
	if(contaisn_cycle(&G)){
		printf("NO");
	}else{
		printf("YES");
	}
	return 0;
}