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; }