C++ 圖的深度優先搜尋和廣度優先搜尋實現
阿新 • • 發佈:2018-12-14
06-圖1 列出連通集 (25 point(s))
給定一個有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 }
這裡用二維鄰接矩陣的方法儲存圖。為了簡單,直接使用全域性變數儲存資料,圖的連通性使用深度優先搜尋演算法和廣度優先演算法實現
#include<cstdio> #define N 15 int G[N][N], int Nv; // 邊數 int Ne; // 頂點數 bool Visited[N]; void InitVisit() { // 初始化訪問變數 for(int i=0;i<N;i++) Visited[i] = false; } void DFS(int V) { // 深度優先搜尋演算法 Visited[V] = true; printf("%d ",V); for(int i=0;i<Nv;i++) { if(!Visited[i]&&G[V][i]) DFS(i); } } void ListComponentsWithDFS() { // 深度優先搜尋格式輸出 for(int i=0;i<Nv;i++) { if(!Visited[i]) { printf("{ "); DFS(i); printf("}\n"); } } } void BFS(int V) { // 廣度優先搜尋,用佇列輔助 const int MAX_SIZE = 100; int Queue[MAX_SIZE]; int first = -1,last = -1; Queue[++last] = V; Visited[V] = true; while(first<last) { int F = Queue[++first]; printf("%d ",F); for(int i=0;i<Nv;i++) { if(G[F][i]&&!Visited[i]) { Queue[++last] = i; Visited[i] = true; } } } } void ListComponentsWithBFS() { // 廣度優先搜尋格式輸出 for(int i=0;i<Nv;i++) { if(!Visited[i]) { printf("{ "); BFS(i); printf("}\n"); } } } void CreateGraph() { // 用鄰接矩陣建立圖 int v1,v2; scanf("%d %d",&Nv,&Ne); for(int i=0;i<Nv;i++) { for(int j=0;j<Nv;j++) { G[i][j] = 0; } } for(int i=0;i<Ne;i++) { scanf("%d %d",&v1,&v2); G[v1][v2] = G[v2][v1] = 1; } } int main() { CreateGraph(); InitVisit(); ListComponentsWithDFS(); InitVisit(); ListComponentsWithBFS(); }