7-6 列出連通集 (25 分)(bfs和dfs)
阿新 • • 發佈:2019-01-05
給定一個有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 <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <stack> #include <queue> #include <cmath> using namespace std; const int inf=999999; const int maxn=12; int n,e,G[maxn][maxn]; bool vis[maxn],inq[maxn]; void dfs(int u){ vis[u]=true; cout<<" "<<u; for(int v=0;v<n;v++){ if(vis[v]==false&&G[u][v]!=inf) dfs(v); } } void dfsTravel(){ for(int u=0;u<n;u++){ if(vis[u]==false){ cout<<"{"; dfs(u); cout<<" }\n"; } } } void bfs(int u){ queue<int> q; q.push(u); inq[u]=true; while(!q.empty()){ int temp=q.front(); cout<<" "<<temp; q.pop(); for(int v=0;v<n;v++){ if(inq[v]==false&&G[temp][v]!=inf){ q.push(v); inq[v]=true; } } } } void bfsTravel(){ for(int u=0;u<n;u++){ if(inq[u]==false){ cout<<"{"; bfs(u); cout<<" }\n"; } } } int main() { fill(G[0],G[0]+maxn*maxn,inf); cin>>n>>e; for(int i=0;i<e;i++){ int a,b; cin>>a>>b; G[a][b]=G[b][a]=1; } dfsTravel(); bfsTravel(); return 0; }