图1 列出连通集

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v1 v​2 ... v​k }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

输出样例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }

我的代码(g++6.5.0)

#include <iostream>

#define MaxVertexNum 10
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */

typedef struct GNode *PtrToGNode;
struct GNode {
	int Nv;  /* 顶点数 */
	int Ne;  /* 边数   */
	WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */

MGraph createGraph(int VertexNum) {
	Vertex V, W;
	MGraph Graph = (MGraph)malloc(sizeof(struct GNode));  //建立图
	Graph->Nv = VertexNum;
	Graph->Ne = 0;
	/* 初始化邻接矩阵 */
	/* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
	for (V = 0; V < Graph->Nv; V++)
		for (W = 0; W < Graph->Nv; W++)
			Graph->G[V][W] = 0; //初始0,表示顶点间无边

	return Graph;
}
void insertEdge(MGraph Graph,Vertex V, Vertex W) {
	Graph->G[V][W] = 1; //1表示两个顶点间存在边
	Graph->G[W][V] = 1;
}

typedef struct Queue *PtrToQueue;
struct Queue {
	int Front;
	int Rear;
	int maxSize;
	Vertex Arr[MaxVertexNum+1]; //留一空间不存储数据,仅用于判断是否为空
};
typedef PtrToQueue Que;

Que createQue() { //用循环数组表示队列
	Que Q = (Que)malloc(sizeof(struct Queue));  //建立队列
	Q->maxSize = MaxVertexNum+1;
	Q->Front = 0;
	Q->Rear = 0;
	return Q;
}
bool QueIsFull(Que Q) {
	if ((Q->Rear + 1)%Q->maxSize == Q->Front) return true;
	else return false;
}
bool QueIsEmpty(Que Q) {
	if (Q->Rear == Q->Front) return true;
	else return false;
}

void EnterQue(Que Q, Vertex V) {
	if (QueIsFull(Q)) return;
	Q->Rear = (Q->Rear + 1) % Q->maxSize;
	Q->Arr[Q->Rear] = V;
}
Vertex DelQue(Que Q) {
	if (QueIsEmpty(Q)) return -1;
	Q->Front = (Q->Front + 1) % Q->maxSize;
	return Q->Arr[Q->Front];
}
Vertex visited[MaxVertexNum]; //记录已被遍历的节点

void DFS(MGraph Graph, Vertex V) {
	visited[V] = true;
	printf(" %d",V);
	for (Vertex W = 0; W < MaxVertexNum;W++) {
		if (Graph->G[V][W] == 1 && !visited[W])
			DFS(Graph,W);
	}
}
void BFS(MGraph Graph,Vertex V,Que Q) {
	visited[V] = true;
	EnterQue(Q,V);
	while (!QueIsEmpty(Q)) {
		Vertex W = DelQue(Q);
		printf(" %d", W);
		for (Vertex U= 0; U < MaxVertexNum; U++) {
			if (Graph->G[W][U] == 1 && !visited[U]) {
				visited[U] = true;
				EnterQue(Q, U);
			}
		}
	}
}

int main()
{	
	int N,E;
	int i;
	scanf("%d %d\n",&N,&E);
    //rewind(stdin); //清空键盘文件缓存,用于VS调试,待删除
	MGraph Graph = createGraph(N);
	Que Q = createQue();
	for (i = 0; i < E;i++) {
		Vertex V, W;
		scanf("%d %d\n", &V, &W);
		insertEdge(Graph, V, W);
         //rewind(stdin); //清空键盘文件缓存,用于VS调试,待删除
	}
	for (i = 0; i < N;i++) {
		if (visited[i] == false) {
			printf("{");
			DFS(Graph,i);
			printf(" }\n");
		}
	}
	for (i = 0; i < N; i++) visited[i] = false; //重新初始化visited数组值为false
	for (i = 0; i < N; i++) {
		if (visited[i] == false) {
			printf("{");
			BFS(Graph, i, Q);
			printf(" }\n");
		}
	}
	return 0;
}
posted @ 2020-07-16 12:10  敵人杰  阅读(216)  评论(0编辑  收藏  举报