반응형
문제 링크: https://www.acmicpc.net/problem/5567
5567번: 결혼식
문제 상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 친구의 친구를 초대하기로 했다. 상근이의 동기는 모두 N명이고, 이 학생들의 학번은 모두 1부터 N까지이다. 상근이의 학번은 1이다. 상근이는 동기들의 친구 관계를 모두 조사한 리스트를 가지고 있다. 이 리스트를 바탕으로 결혼식에 초대할 사람의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 상근이의 동기의 수 n (2 ≤ n ≤ 500)이 주어진다. 둘째 줄에는 리스트의 길이 m (1 ≤ m
www.acmicpc.net
<문제 풀이> 그래프, BFS
자신의 친구와, 친구의 친구까지 초대하는 거니깐 BFS로 자신의 위치인 1번 정점에서 거리가 최대 3까지만 탐색하면 됩니다.
무방향 그래프이므로 인접 리스트를 양방향으로 갱신해줍니다.
거리를 체크하는 방법은 큐에 next를 삽입하고 visited배열로 방문 체크할 때 다음과 같이 거리에 대한 정보를 넣어주면 됩니다.
visited[next] = visited[cur] + 1;
<C++ 소스 코드>
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
40
41
42
|
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n, m;
int visited[501];
vector<vector<int> > adj(501);
int cnt = 0;
void bfs() {
queue<int> q;
q.push(1);
visited[1] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (auto& next : adj[cur]) {
if (visited[next] || visited[cur] >= 3)continue;
q.push(next);
visited[next] = visited[cur] + 1;
cnt++;
}
}
}
int main(void) {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
bfs();
cout << cnt;
return 0;
}
|
cs |
반응형
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1043번] 거짓말 (0) | 2020.03.25 |
---|---|
[백준 6118번] 숨바꼭질 (0) | 2020.03.23 |
[백준 2606번] 바이러스 (0) | 2020.03.22 |
[백준 1260번] DFS와 BFS (0) | 2020.03.22 |
[백준 11724번] 연결 요소의 개수 (0) | 2020.03.21 |