給定一個有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<queue>
#include<vector>
#include<string.h>
using namespace std;
bool flag[100] = {false};
int data[100][100] = {0};
int cnt = 0;
int n,e;
void dfs(int start,vector<int> &shuzu)
{
shuzu.push_back(start);
cnt++;
flag[start] = true;
for(int i = 0;i < n;i++)
{
if(!flag[i] && data[start][i])
{
dfs(i,shuzu);
}
}
}
int main()
{
cin >> n >> e;
int first,second;
for(int i = 0;i < e;i++)
{
cin >> first >> second;
data[first][second] = data[second][first] = 1;
}
while(true)
{
if(cnt >= n)break;
int begin;
for(int i = 0;i < n;i++)
{
if(!flag[i])
{
begin = i;
break;
}
}
vector<int>res;
dfs(begin,res);
cout << "{ ";
for(int i = 0;i < res.size();i++)cout << res[i] << " ";
cout << "}" << endl;
}
cnt = 0;
memset(flag,0,sizeof(flag));
while(true)
{
if(cnt >= n)break;
int begin;
for(int i = 0;i < n;i++)
{
if(!flag[i])
{
begin = i;
break;
}
}
vector<int>res;
queue<int> temp;
temp.push(begin);
flag[begin] = true;
while(!temp.empty())
{
int tmp = temp.front();
res.push_back(tmp);
temp.pop();
cnt++;
for(int i = 0;i < n;i++)
{
if(!flag[i] && data[tmp][i])
{
temp.push(i);
flag[i] = true;
}
}
}
cout << "{ ";
for(int i = 0;i < res.size();i++)
{
cout << res[i] << " ";
}
cout << "}"<<endl;
}
}