列出連通集 (25 分)

給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:

輸入第1行給出2個整數N(0<N≤10)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。

輸出格式:

按照"{ v​1​​ v​2​​ ... v​k​​ }"的格式,每行輸出一個連通集。先輸出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;
	}
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章