BÀI TOÁN CHIA KẸO

BÀI TOÁN CHIA KẸO 




#include<stdio.h>

#define N 500
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;
}
int degree_vao(Graph *G, int x){
	int i,dem=0;
	for(i=1;i<=G->n;i++)
			if(G->A[i][x]==1)
				dem++;
		return dem;
}
// Cau truc List stack queue

typedef int ElementType;
typedef struct{
	ElementType data[500];
	int size;
}List;
//Khoi tao danh sach list
void make_null_list(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_null_list(&L);
	int i;
	for(i=1;i<=G->n;i++)
		if(adjacent(G,x,i))
			push_list(&L,i);
	return L;
}
//Khoi tao hang doi
typedef struct{
	ElementType data[500];
	int front, rear;
}Queue;
void make_null_queue(Queue *Q){
	Q->front=0;
	Q->rear=-1;
}
void push_queue(Queue *Q, int x){
	Q->rear++;
	Q->data[Q->rear]=x;
}
int top_queue(Queue *Q){
	return Q->data[Q->front];
}
void pop_queue(Queue *Q){
	Q->front++;
}
int empty_queue	(Queue *Q){
	return Q->front>Q->rear;
}
int keo[100];
void topo_sort(Graph *G,List *L){
	int d[500];
	int i;
	for(i=1;i<=G->n;i++){
		d[i]=degree_vao(G,i);
		keo[i]=1;
	}
	Queue Q;
	make_null_queue(&Q);
	for(i=1;i<=G->n;i++){
		if(d[i]==0){
			push_queue(&Q,i);
		}
	}
	make_null_list(L);
	while(!empty_queue(&Q)){
		int u=top_queue(&Q);
		pop_queue(&Q);
		push_list(L,u);
		List L1=neighbors(G,u);
		for(i=0;i<L1.size;i++){
			int v=L1.data[i];
				d[v]--;
				keo[v]=keo[u]+1;
			if(d[v]==0)
				push_queue(&Q,v);
		}
		
	}
}
int main(){
	Graph G;
	int i,n,m,e,u,v;
	freopen("dt.txt","r",stdin);
	scanf("%d%d",&n,&m);
	init_graph(&G,n);
	for(e=1;e<=m;e++){
		scanf("%d%d",&v,&u);///doi vi tri v voi u
		add_graph(&G,u,v);
	}
	List L;
	int k=0;
	topo_sort(&G,&L);
	for(i=1;i<=L.size;i++){
		printf("%d\n",keo[i]);
		k=k+keo[i];
	}
	printf("%d",k);
	return 0;	
}