백준 1260번 DFS와 BFS

빵어 ㅣ 2023. 3. 7. 16:47

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

// n: 정점의 개수, m: 간선의 개수
// v: 탐색을 시작할 정점의 번호
int n, m, v;
bool visited[1001];
pair<int, int> line[10001];

void dfs(int x) {
	visited[x] = true;
	cout << x << ' ';
	
	for (int i = 0; i < m; ++i) {
		if (x == line[i].first && !visited[line[i].second])
			dfs(line[i].second);
		else if (x == line[i].second && !visited[line[i].first])
			dfs(line[i].first);
	}
}

void bfs(int x) {
	queue<int> q;
	q.push(x);

	visited[x] = true;

	while (!q.empty()) {
		int a = q.front();
		cout << a << ' ';

		q.pop();

		for (int i = 0; i < m; ++i) {
			if (a == line[i].first && !visited[line[i].second]) {
				q.push(line[i].second);
				visited[line[i].second] = true;
			}
			else if (a == line[i].second && !visited[line[i].first]) {
				q.push(line[i].first);
				visited[line[i].first] = true;
			}
		}
	}
}

int main() {
	cin >> n >> m >> v;

	for (int i = 0; i < m; ++i) {
		cin >> line[i].first >> line[i].second;
		if (line[i].first > line[i].second)
			swap(line[i].first, line[i].second);
	}
	sort(line, line + m);
	
	dfs(v);
	cout << endl;
	for (int i = 0; i <= n; ++i)
		visited[i] = false;
	bfs(v);

	return 0;
}

질문게시판의 15페이지까지 샅샅이 반례를 찾았지만

다 맞는걸로 나와서 대체 어디가 문제인지 알 수 없었던 문제..

다음날에 다시 푸니 어이없게도 for문의 범위가 문제였다..

(dfs와 bfs함수 내에 for문 범위를 간선의 개수로 설정했어야 하는데 정점의 개수로 설정)

 

for문의 범위는 잘 생각해보고 설정하자..ㅠ

 

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

 

1260번: DFS와 BFS

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

www.acmicpc.net

 

'알고리즘 공부' 카테고리의 다른 글

백준 1012번 유기농 배추  (0) 2023.03.10
백준 2606번 바이러스  (0) 2023.03.07
백준 1541번 일어버린 괄호  (0) 2023.03.06
백준 1026번 보물  (0) 2023.03.03
백준 11399번 ATM  (0) 2023.03.02