반응형
    
    
    
  문제 링크 : https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
문제 설명
주석으로 대체
소스 코드
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAX = 1001;
int N, M, V; //정점, 간선, 탐색 시작 번호
int adjacent[MAX][MAX];
bool visited[MAX];
queue<int> q;
void DFS(int idx) {//idx부터 시작한다.
	cout << idx << ' ';
	for (int i = 1; i <= N; i++) {
		if (adjacent[idx][i] && !visited[i]) {//만약 노드 idx와 연결된 점이 있고, 방문하지 않았다면
			visited[i] = 1; //방문하고
			DFS(i); //DFS 재귀
		}
	}
}
void BFS(int idx) {
	q.push(idx);
	visited[idx] = 1;//idx 부터 시작한다. 노드 idx는 방문한 상태로 시작한다.
	while (!q.empty()) {//큐가 빌 때까지
		idx = q.front();
		q.pop();//idx에 시작값을 넣고, 큐를 비운다.
		cout << idx << ' ';
		for (int i = 1; i <= N; i++) {//idx에 연결되었고 미방문 노드를 모두 차례로 방문 & visited체크 & 큐에 push
			if (adjacent[idx][i] && !visited[i]) {
				visited[i] = 1;
				q.push(i);
			}
		}//for문이 끝나면 큐에 차례대로 노드들이 있을 것. 제일 먼저 방문한노드(idx로 설정된)를 출력하고 pop.
	}//방금 pop된 노드와 연결된 미방문 노드들을 체크하고 큐에 넣는다. 차레대로 수행되면 BFS가 완료된다.
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> N >> M >> V;
	for (int i = 0; i < M; i++) {
		int from, to;
		cin >> from >> to;
		adjacent[from][to] = 1;
		adjacent[to][from] = 1;
	}
	visited[V] = 1;//시작점은 방문한 상태로 DFS를 수행
	DFS(V);
	cout << '\n';
	memset(visited, false, sizeof(visited));//DFS에서 사용한 visited 배열을 모두 0으로 초기화
	BFS(V);
	cout << '\n';
}반응형
    
    
    
  'Programming Solve > BOJ' 카테고리의 다른 글
| BOJ 2667 - 단지 번호 붙이기 / C++ (0) | 2022.02.13 | 
|---|---|
| BOJ 1697 - 숨바꼭질 / C++ (0) | 2022.02.12 | 
| BOJ 1991 - 트리 순회 / C++ (0) | 2022.02.02 | 
| C++ - 소수 판별 / 단순 브루트포스, 에라토스테네스의 체 (0) | 2021.10.12 | 
| BOJ 1920 수 찾기 / C++, 시간 초과 방지 팁 (0) | 2021.09.01 |