★★★★☆
DFS와 BFS가 뭔지도 잘 모르는 상태에서 시작했더니 체감 난이도가 높았다..
https://www.acmicpc.net/problem/1260
(열혈 자료구조 책 참고. 내가 이해한대로 정리하기)
#include <iostream>
#include <queue>
#define MAXSIZE 1001
using namespace std;
int n, m, v;
bool graph[MAXSIZE][MAXSIZE];
bool visit[MAXSIZE];
queue<int> dfsqueue;
void resetvisit() {
for (int i = 0; i < MAXSIZE; i++) {
visit[i] = false;
}
}
void dfs(int p) {//DFS, 깊이우선탐색
visit[p] = true;
cout << p << " ";
for (int i = 1; i <=n; i++) {
if (graph[p][i]&&!visit[i]) { //연결되어 있고, 방문하지 않았다면 다음으로
visit[i] = true; //방문 기록
dfs(i);
}
}
return; //방문할 노드가 없다면 리턴
}
void bfs(int p) {//BFS, 너비우선탐색
dfsqueue.push(p); //현재 정점을 실행하기 위해 push해줌
visit[p] = true;
cout << p << " ";
while (!dfsqueue.empty()) {
int tem = dfsqueue.front();
dfsqueue.pop();
for (int i = 1; i <= n; i++) {
if (graph[tem][i] && !visit[i]) { //연결되어 있고, 방문하지 않았다면 다음으로
visit[i] = true; //방문 기록
dfsqueue.push(i); //큐에 정점 기록하기
cout << i << " ";
}
}
}
return;
}
int main() {
cin >> n >> m >> v;
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
graph[x][y] = true;
graph[y][x] = true;
}
resetvisit();
dfs(v);
cout << "\n";
resetvisit();
bfs(v);
cout << "\n";
return 0;
}
전역변수를 사용해서 풀었지만, 함수의 매개변수로 그래프와 배열을 전달하는 방법도 있다.
그래프는 class를 사용해서 구현해보기도 하였지만, 코드가 무거워질뿐 큰 이점은 없어서 2차원배열로 변경했다.