7-6 列出連通集 (25 分)
阿新 • • 發佈:2018-12-17
給定一個有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<bits/stdc++.h>
using namespace std;
int n,e;
int a[101][101]={0};
int vis[101]={0};
int vbs[101]={0};
void dfs(int x){
stack<int>s;
s.push(x);
vis[x]=1;
bool f=false;
cout<<"{ "<<x<<" ";
while(!s.empty()){
f=false;
int v=s.top() ;
for(int i=0;i<n;i++){
if(!vis[i]&&a[v][i]){
cout<<i<<" ";
vis[i]=1;
s.push(i);
f=true;
break;
}
}
if(!f){
s.pop();
}
}
cout<< "}"<<endl;
}
void bfs(int x){
queue<int>q;
vbs[x]=1;
q.push(x);
cout<<"{ ";
while(!q.empty()){
int v=q.front();
cout<<v<<" ";
q.pop();
for(int i=0;i<n;i++){
if(!vbs[i]&&a[v][i]){
vbs[i]=1;
q.push(i);
}
}
}
cout<<"}"<<endl;
}
int main()
{
cin>>n>>e;
for(int i=0;i<e;i++){
int b,c;
cin>>b>>c;
a[b][c]=a[c][b]=1;
}
for(int i=0;i<n;i++){
if(!vis[i])dfs(i);
}
for(int i=0;i<n;i++){
if(!vbs[i])bfs(i);
}
}