Untitled

 avatar
unknown
c_cpp
3 years ago
1.9 kB
4
Indexable
#include <stdio.h>

#define MAX_ELEMENTS 100
#define MAX_VERTICES 100

//Ma tran ke
typedef struct {
	int n;
	int A[MAX_VERTICES][MAX_VERTICES];
} Graph;

void init_G(Graph *G, int n) {
	int i, j;
	G->n = n;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			G->A[i][j] = 0;
}

void add_edge(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];
}

//List
typedef struct {
	int data[MAX_ELEMENTS];
	int size;
} List;

void make_null_L (List *L) {
	L->size=0;
}

void push_back_L (List *L, int x) {
	L->data[L->size] = x;
	L->size++;
}

int elementat_L(List *L, int i) {
	return(L->data[i-1]);
}

List neighbors(Graph *G, int x) {
	//Graph G;
	int y;
	List L;
	make_null_L(&L);
	for(y=1;y<=G->n;y++)
		if(adjacent(G,x,y)==1)
			push_back_L(&L, y);
	return L;
}

//Hang doi
typedef struct {
	int data[MAX_ELEMENTS];
	int size;
} Stack;

void make_null_S(Stack *S) {
	S->size=0;
}

void push_S(Stack *S, int x) {
	S->data[S->size] = x;
	S->size++;
}

int top_S(Stack *S) {
	return S->data[S->size-1];
}

void pop_S(Stack *S) {
	S->size--;
}

int empty_S(Stack *S) {
	return S->size=0;
}

int mark[100];

void DFS(Graph *G, int x) {
	Stack S;
	make_null_S(&S);
	push_S(&S,x);
	while (!empty_S(&S)) {
		int u=top_S(&S); pop_S(&S);
		if (mark[u]!=0) continue;
		printf("%d\n",u);
		mark[u]=1;
		int i;
		for (i=1;i<=G->n;i++){
			if (adjacent(G,u,i))
				push_S(&S,i);
		}
	}
}

int main() {
	freopen("dt.txt", "r", stdin); //Chay tren else nho bo dong nay
	Graph G;
	int n, m, u, v, e;
	scanf("%d%d", &n, &m);
	init_G(&G, n);
	
	for (e = 0; e < m; e++) {
		scanf("%d%d", &u, &v);
		add_edge(&G, u, v);
	}
	
	int i;
	for (i=1;i<=G.n;i++)
		mark[i]=0;
	for (i=1;i<=G.n;i++)
		if (mark[i]==0)
			DFS(&G,i);
	return 0;
}
Editor is loading...