https://www.acmicpc.net/problem/1260
DFS 조지는 중이라 DFS만 쓴다.
그래프의 크기와 간선에 대한 정보가 주어졌을 때
그래프를 DFS로 노드를 방문한 순서와 BFS로 방문한 순서를 각각 출력해야 한다.
지금은 DFS를 공부중이니 DFS로 풀어낸 방법을 복습겸 적는다.
우선 주어진 입력 중 노드의 갯수 n으로 인접행렬의 크기를 설정한다.
그리고 방문 여부를 결정하는 visited 배열을 n 크기만큼 할당받는다.
이후 노드간 연결 정보를 차례대로 입력받는다 무방향 그래프이기 때문에 <u,v>,<v,u> 모두 연결됬음을 표시해야 한다.
그래프 입력이 완료되면 DFS를 수행한다.
DFS는 인접행렬 graph와 visited, 시작점 s를 넘겨 받고 그래프를 순회한다.
graph에서 s에 접근한 뒤 인접 노드 i가 연결되어 있는 지 확인하고 연결되어 있다면 방문하지 않았는 지 확인한다.
노드가 연결되어 있고 방문하지 않았다면 시작점 i를 넘겨주고 DFS를 수행한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include<iostream> using namespace std; void dfs(bool **graph,bool *visited, int n, int s) { visited[s] = true; cout << s + 1 << endl; for (int i = 0; i < n; i++) { if (graph[s][i] && !visited[i]) dfs(graph, visited, n, i); } } int main() { int n, m, s; int u, v; bool **graph; cin >> n >> m >> s; graph = new bool*[n]; for (int i = 0; i< n;i++) { graph[i] = new bool[n]; for (int j = 0; j < n; j++) graph[i][j] = false; } for (int i = 0; i < m;i++) { cin >> u >> v; u = u - 1, v = v - 1; graph[u][v] = true; graph[v][u] = true; } bool *visited = new bool[n]; for (int i = 0; i < n; i++) visited[i] = false; s = s - 1; dfs(graph,visited, n, s); system("pause"); return 0; } | cs |
'백준' 카테고리의 다른 글
6603)로또 (0) | 2019.03.16 |
---|---|
1012)유기농 배추2(DFS) (0) | 2019.03.16 |
1009)분산처리 (0) | 2019.03.16 |
3208)배고픈 애벌레 (0) | 2019.03.15 |
1373)2진수 8진수 (0) | 2019.03.11 |