Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 중복 순열
- dfs
- 이분 탐색
- 세그먼트 트리
- BFS
- 재귀
- 링크드리스트
- 완전 탐색
- 큐
- 메모리풀
- lis
- 시뮬레이션
- 문자열
- 순열
- 크루스칼
- 스택
- SSAFY
- MST
- 우선순위 큐
- 비트마스크
- 백트래킹
- Knapsack
- 조합
- 피보나치 수
- 클래스
- 빠른 입출력
- DP
- 분할 정복
- BeautifulSoup
- 그리디
Archives
- Today
- Total
작심 24/7
[백준] 2644번 촌수계산 본문
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진�
www.acmicpc.net
BFS와 재귀로 풀었다.
x, y의 촌수를 구해야 할 때 x를 루트로 잡고
x부터 y가 나올 때까지 BFS 해주었다.
만약 y를 만나지 못한다면 -1을 출력했다.
무방향 그래프이므로 입력받을 때
벡터[x]=y, 벡터[y]=x
둘 다 값을 넣어준다.
BFS 해줄 때 다음 노드로 넘어갈 때마다 촌수를 +1 해주었고
현재 노드와 연결된 모든 노드들을 검사한 후(검사하는 노드마다 방문 체크)
검사가 다 끝나면 이전 노드로 돌아가기 전에 촌수를 -1 해주었다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector <int> v[101];
int RES = 0, res = 0, finish = 0, visited[101] = { 0 };
void Bfs(int x, int y) {
if (finish) return;
queue <int> q;
if (x == y) {
finish = 1;
RES = res;
return;
}
while (!v[x].empty()) {
if (!visited[v[x].back()]) q.push(v[x].back());
v[x].pop_back();
}
if (q.empty()) return;
res++;
while (!q.empty()) {
visited[q.front()] = 1;
Bfs(q.front(), y);
q.pop();
}
res--;
}
int main() {
int N, x, y, M, a, b;
cin >> N >> x >> y >> M;
for (int m = 0; m < M; m++) {
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
visited[x] = 1;
Bfs(x, y);
if (finish) cout << RES;
else cout << "-1";
return 0;
}
'백준' 카테고리의 다른 글
[백준] 7562번 나이트의 이동 (0) | 2020.06.15 |
---|---|
[백준] 2178번 미로 탐색 (0) | 2020.06.15 |
[백준] 9029번 정육면체 (0) | 2020.06.13 |
[백준] 2468번 안전 영역 (C++, JAVA) (0) | 2020.06.10 |
[백준] 10026번 적록색약 (C++, JAVA) (0) | 2020.06.10 |
Comments