圖1 列出連通集
阿新 • • 發佈:2020-07-16
給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。
輸入格式:
輸入第1行給出2個整數N(0<N≤10)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。
輸出格式:
按照"{ v1 v2 ... vk }"的格式,每行輸出一個連通集。先輸出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; }