전공/알고리즘

백준 1260(dfs와 bfs)

xkdlaldfjtnl 2020. 6. 17. 12:49

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제에 써있듯이 dfs랑 bfs를 구현할 수 있는가 묻는 단순한 문제이다. 

 

여기서 중요한것은 bfs를 할 때, vector를 이용해서 인접리스트를 만드는 것이다. 

 

vector는 push_back, pop_back이 있어서 거의 queue처럼 사용할 수 있다는 것을 알아야 한다.

처음에는 이렇게 할 수 있다는 걸 모르고, 이차원 벡터로 만들어서 풀려다가 엄청나게 헤맸다. 

 

또한 구현할 때, 

 

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

    v.back();

    ~~~

   v.pop_back();

   ~~~~~

}

 

이런 식으로 구현하게 되면 i는 증가하는데 v.size()는 감소하므로 원하는 결과가 나오지 않으므로 주의하자. 

 

 

문제 조건에서 둘 다 인접한 그래프에 대해서 오름차순으로 접근 하라고 했어서 dfs는 그냥 for문을 통해서 접근했고, bfs는 따로 정렬을 해주었다.

#include<iostream>
#include<queue>
#include<utility>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
#define MAX 1001
#define MAX2 10001

int N, M, start, a, b, tmp, tmp2;
vector<int> v[MAX];
bool mat[MAX][MAX] = { false };
bool visited[MAX] = { false };
bool visited2[MAX] = { false };
queue<int> q;

void bfs(int index) {
	q.push(index);
	visited2[index] = true;
	while (!q.empty()) {
		tmp = q.front();
		cout << tmp << " ";
		q.pop();
		while(!v[tmp].empty()){
			tmp2 = v[tmp].back();
			v[tmp].pop_back();
			if (!visited2[tmp2]) {
				q.push(tmp2);
				visited2[tmp2] = true;
			}
		}
	}
}

void dfs(int index) {
	visited[index] = true;
	cout << index << " ";
	for (int i = 1; i <= N; i++) {
		if (mat[index][i] && !visited[i]) {
			dfs(i);
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M >> start;
	for (int i = 0; i < M; i++) {
		cin >> a >> b;
		mat[a][b] = true;
		mat[b][a] = true;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for (int i = 1; i <= N; i++) {
		sort(v[i].begin(), v[i].end(), greater<int>() );
	}
	dfs(start);
	cout << "\n";
	bfs(start);
}