알고리즘 및 자료구조/그래프

C++ 백준 5567 결혼식

Sh_Blog 2024. 3. 22. 19:48

백준 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;
}