06-图1 列出连通集

#include <stdio.h>
#include <stdlib.h>

#define MaxVertexNum 10
int Visited[MaxVertexNum];

typedef struct MGraph{
	int Vertices[MaxVertexNum];
	int Edges[MaxVertexNum][MaxVertexNum];
	int n, e;
} MGraph;

typedef struct QNode{
	int Data[MaxVertexNum];
	int rear;
	int front;
} QNode, *Queue;

void Reset_tmp(MGraph *G);
void Reset_Visited();
int Check_Visited(MGraph *G);

Queue Create_Queue();
void Add_Queue(Queue Q, int item);
int Delete_Queue(Queue Q);
int IsEmpty_Queue(Queue Q);

void Create_MGraph(MGraph *G);
void DFS(MGraph *G, int i);
void BFS(MGraph *G);
int FirstAdjV(MGraph *G, int V);
int NextAdjV(MGraph *G, int V, int W);

int main(int argc, char const *argv[])
{
	// freopen("test.txt", "r", stdin);
	for (int i = 0; i < MaxVertexNum; i++)
		Visited[i] = 0;
	MGraph G;
	Create_MGraph(&G);
	for (int i = 0; i < G.n; i++){
		if (Visited[i] == 0){
			printf("{ ");
			DFS(&G, i);
			printf("}\n");
		}
	}
	Reset_Visited();
	BFS(&G);
	return 0;
}

Queue Create_Queue()
{
	Queue Q = (Queue)malloc(sizeof(QNode));
	Q->rear = Q->front = 0;
	return Q;
}

void Add_Queue(Queue Q, int item)
{
	if((Q->rear+1) % MaxVertexNum == Q->front){
		printf("Queue is full\n");
		return;
	}
	Q->rear = (Q->rear+1) % MaxVertexNum;
	Q->Data[Q->rear] = item;
}

int Delete_Queue(Queue Q)
{
	if(IsEmpty_Queue(Q)){
		printf("Queue is empty\n");
		return -1;
	}
	Q->front = (Q->front+1) % MaxVertexNum;
	return Q->Data[Q->front];
}

int IsEmpty_Queue(Queue Q)
{
	if(Q->rear == Q->front)
		return 1;
	else
		return 0;
}

int Check_Visited(MGraph *G)
{
	for (int i = 0; i < G->n; i++){
		if (!Visited[i])
			return 1;
	}
	return 0;
}

void Reset_Visited()
{
	for (int i = 0; i < MaxVertexNum; i++)
		Visited[i] = 0;
}

void Create_MGraph(MGraph *G)
{

	scanf("%d %d", &(G->n), &(G->e));
	for (int i = 0; i < G->n; i++){
		for (int j = 0; j < G->n; j++)
			G->Edges[i][j] = 0;
	}
	int i, j;
	for (int k = 0; k < G->e; k++){
		scanf("%d %d", &i, &j);
		G->Edges[i][j] = 1;
		G->Edges[j][i] = 1;
	}
}

void DFS(MGraph *G, int i)
{
	Visited[i] = 1;
	printf("%d ", i);
	for (int j = 0; j < G->n; j++){
		if(G->Edges[i][j] == 1 && Visited[j] == 0)
			DFS(G, j);
	}
}

void BFS(MGraph *G)
{
	int V, W;
	Queue Q = Create_Queue();
	for (int i = 0; i < G->n; i++){
		if (Visited[i] == 0){
			printf("{ ");
			Visited[i] = 1;
			printf("%d ", i);
			Add_Queue(Q, i);
			while(!IsEmpty_Queue(Q)){
				V = Delete_Queue(Q);
				for(W = FirstAdjV(G, V); W < G->n; W = NextAdjV(G, V, W)){
					if(!Visited[W]){
						Visited[W] = 1;
						printf("%d ", W);
						Add_Queue(Q, W);
					} 
					else
						break;
				}
			}
			printf("}");
			if (Check_Visited(G))
				printf("\n");
		}
	}
}

int FirstAdjV(MGraph *G, int V)
{
	for (int i = 0; i < G->n; i++){
		if (G->Edges[V][i] == 1 && Visited[i] == 0)
			return i;
	}
}

int NextAdjV(MGraph *G, int V, int W)//不考虑W反而过了 
{
	for (int i = 0; i < G->n; i++){
		if (G->Edges[V][i] == 1 && Visited[i] == 0)
			return i;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值