본문 바로가기
SWE/코테

백준_1260_DFS와BFS

by S나라라2 2018. 7. 19.
반응형

C++ 사용하기

자료형 vector 사용하기


방법1. BFS - 반복문을 이용해서 구현해보기


방법2. BFS - 재귀함수를 이용해서 구현해보기



방법1 코드.



// c++ 쓰기
// vector 쓰기 - 2차원 배열

#include
#include //memset
#include
#include
#include
using namespace std;

vector< vector> arr(10001); //arr[10001][]
int n, m, v; // 정점개수, 간선개수, 탐색시작번호
int visited[1001] = { 0, }; // 0: 방문 안함
                            // 1: 방문 함
int cnt = 0; // 방문 정점 개수
vector stack;
queue que;

void dfs(int idx);
void bfs(int idx);

int main(void) {

	cin >> n >> m >> v;

	for (int i = 0; i < m; i++) {
		int dep, des;
		cin >> dep >> des;
		arr[dep].push_back(des);
		arr[des].push_back(dep);
	}
	
	// 각 정점에 연결된 정점들 오름차순으로 정렬
	for (int i = 1; i <= n; i++) {
		sort(arr[i].begin(),arr[i].end());  
	}

	dfs(v);
	cout << endl;
	memset(visited,0,sizeof(visited));
	cnt = 0;
	bfs(v);

	return 0;
}

void dfs(int idx) {

	cout << idx << " "; // 출력
	visited[idx] = 1; // 방문 표시

	if (cnt++ == n) { // 모두 방문
		return;
	}

	int size = arr[idx].size();
	for (int i = 0; i < size; i++) {
		int temp = arr[idx][i];
		if (visited[temp]==0) { // 방문 안했으면 go
			dfs(temp);
		}
	}
}

void bfs(int idx) {

	que.push(idx);
	cout << idx << " "; //출력
	visited[idx] = 1; //방문 표시

	while (!que.empty()) {
		int _idx = que.front();
		que.pop();

		int size = arr[_idx].size();
		for (int i = 0; i < size; i++) {  // 처음부터 방문
			int temp = arr[_idx][i];
			if (visited[temp] == 0) { //방문 안했으면 push
				cout << temp << " "; //출력
				visited[temp] = 1; //방문 표시
				que.push(temp);
			}
		}
	}
}


방법2 코드.


// c++ 쓰기

// vector 쓰기 - 2차원 배열



// queue 사용

#include

#include //memset

#include

#include

#include

using namespace std;



vector< vector> arr(10001); //arr[10001][]

int n, m, v; // 정점개수, 간선개수, 탐색시작번호

int visited[1001] = { 0, }; // 0: 방문 안함

							// 1: 방문 함

int cnt = 0; // 방문 정점 개수

vector stack;

queue que;



void dfs(int idx);

void bfs(int idx);



int main(void) {



	cin >> n >> m >> v;



	for (int i = 0; i < m; i++) {

		int dep, des;

		cin >> dep >> des;

		arr[dep].push_back(des);

		arr[des].push_back(dep);

	}



	// 각 정점에 연결된 정점들 오름차순으로 정렬

	for (int i = 1; i <= n; i++) {

		sort(arr[i].begin(), arr[i].end());

	}



	dfs(v);

	cout << endl;

	memset(visited, 0, sizeof(visited));

	cnt = 0;

	bfs(v);



	return 0;

}



void dfs(int idx) {



	cout << idx << " "; // 출력

	visited[idx] = 1; // 방문 표시



	if (cnt++ == n) { // 모두 방문

		return;

	}



	int size = arr[idx].size();

	for (int i = 0; i < size; i++) {

		int temp = arr[idx][i];

		if (visited[temp] == 0) { // 방문 안했으면 go

			dfs(temp);

		}

	}

}



void bfs(int idx) {



	if (visited[idx] == 0) { // 방문 안했을 때만

		cnt++;

		cout << idx << " "; //출력

		visited[idx] = 1; //방문 표시

	}



	int size = arr[idx].size();

	for (int i = 0; i < size; i++) {  // 처음부터 방문

		int temp = arr[idx][i];

		if (visited[temp] == 0) { //방문 안했으면 push

			cout << temp << " "; //출력

			visited[temp] = 1; //방문 표시

			que.push(temp);

		}

	}

	// pop

	if (que.empty()) {

		return;

	}

	else {

		int temp = que.front();

		que.pop();

		bfs(temp);

	}

}








반응형