06-圖1 列出連通集 (25分)
阿新 • • 發佈:2018-12-30
給定一個有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 }
主要思路:
1、鄰接矩陣儲存圖
2、深度優先遍歷圖與廣度優先遍歷圖的方法
#include <iostream> #include <vector> #include <queue> using namespace std; #define MaxNode 10 typedef struct { int value[MaxNode][MaxNode]; int N; int M; }Graph; void DFS(vector<int> &flag,Graph &G,int node)//圖的深度優先遍歷 { flag[node]=1; cout<<" "<<node; for (int i=0; i<G.N; ++i) { if (G.value[node][i]==1 && flag[i]==0) { DFS(flag,G,i); } } } void BFS(vector<int> &flag,queue<int> &Q,Graph &G,int node)//圖的廣度優先遍歷 { flag[node]=1; Q.push(node); int temp=0; while (!Q.empty()) { temp=Q.front(); cout<<" "<<temp; Q.pop(); for (int i=0; i<G.N; ++i) { if (G.value[temp][i]==1 && flag[i]==0) { Q.push(i); flag[i]=1; } } } } int main() { //Get the input int N=0,M=0; cin>>N>>M; Graph G; G.N=N; G.M=M; int x=0,y=0; for (int i=0; i<N; ++i)//初始化圖的鄰接矩陣 { for (int k=0; k<N; ++k) { G.value[i][k]=0; } } for (int i=0; i<M; ++i)//修改圖的鄰接矩陣 { cin>>x>>y; G.value[x][y]=1; G.value[y][x]=1; } //根據深度優先遍歷輸出圖的聯通集團 vector<int> flag(N,0);//結點是否被訪問的標記向量 for (int i=0; i<N; ++i) { if (flag[i]==0) { cout<<"{"; DFS(flag,G,i); cout<<" }"<<endl; } } //根據廣度優先遍歷輸出圖的聯通集團 vector<int> flag1(N,0);//結點是否被訪問的標記向量 queue<int> Q; for (int i=0; i<N; ++i) { if (flag1[i]==0) { cout<<"{"; BFS(flag1,Q,G,i); cout<<" }"<<endl; } } }