백준 5567
https://www.acmicpc.net/problem/5567
5567번: 결혼식
예제 1의 경우 2와 3은 상근이의 친구이다. 또, 3과 4는 친구이기 때문에, 4는 상근이의 친구의 친구이다. 5와 6은 친구도 아니고, 친구의 친구도 아니다. 따라서 2, 3, 4 3명의 친구를 결혼식에 초대
www.acmicpc.net
풀이 전 나의 생각
상근이의 친구와 친구의 친구를 결혼식에 초대하기로 했을 때,
동기들의 친구 리스트를 기준으로 초대할 사람의 수를 구해야한다.
조건
- n (2 ≤ n ≤ 500)
- m (1 ≤ m ≤ 10000)
- (1 ≤ ai < bi ≤ n)
과정
상근이의 동기 친구 관계 리스트는 그래프 형태로 주어지기 때문에
그래프를 상근이의 친구, 친구의 친구까지 DFS나 BFS의 형태로 탐색해주면
해결되는 문제다.
1. 동기 친구 리스트의 정보를 저장한다.
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
link[u].push_back(v);
link[v].push_back(u);
}
2. 친구의 친구까지 DFS를 이용하여 탐색을 진행한다.
void dfs(int now, int depth)
{
if (depth == 2) return;
for (int next : link[now])
{
visited[next] = true;
dfs(next, depth + 1);
}
}
친구, 친구의 친구까지라는 의미는 결국 노드의 자식과, 노드의 자식의 자식까지만 탐색한다는 의미기 때문에
상근이의 노드인 1에서 갈 수 있는 최대 깊이인 2까지 모두 방문표시를 해준다.
3. 상근이가 초대할 수 있는 최대 친구의 수를 구한다.
for (int i = 2; i <= n; i++)
{
if (visited[i])
{
ans++;
}
}
방문 표시가 됐다는 건 깊이 2까지 탐색된 노드들이라는 의미다.
따라서 친구와 친구의 친구라는 의미와 같기 때문에 이를 통해 최종값을 구해낼 수 있다.
풀이
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <string>
#include <queue>
#include <string.h>
#include <limits.h>
#include <cstdio>
#include <map>
using namespace std;
vector<vector<int>> link(501);
bool visited[501];
int ans = 0;
void dfs(int now, int depth)
{
if (depth == 2) return;
for (int next : link[now])
{
visited[next] = true;
dfs(next, depth + 1);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
link[u].push_back(v);
link[v].push_back(u);
}
visited[1] = true;
dfs(1, 0);
for (int i = 2; i <= n; i++)
{
if (visited[i])
{
ans++;
}
}
cout << ans;
}
'알고리즘 및 자료구조 > 그래프' 카테고리의 다른 글
C++ 1325 효율적인 해킹 (0) | 2024.03.28 |
---|---|
C++ 백준 1389 케빈 베이컨의 6단계 법칙 (0) | 2024.03.27 |
C++ 백준 2660 회장뽑기 (0) | 2024.03.26 |
C++ 백준 11403 경로 찾기 (0) | 2024.03.25 |
C++ 백준 2606 바이러스 (0) | 2024.03.21 |