1. 程式人生 > 實用技巧 >圖1 列出連通集

圖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 }
{ 6 }

我的程式碼(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;
}