[C++]백준13023번 ABCDE

less than 1 minute read

오늘은 백준13023번 ABCDE 문제를 풀어보도록 하자.

간선의 cnt가 5면 1을 출력하는 문제였다. 인접벡터행렬을 만들어 구현했는데 만일 그냥 인접배열로 만든다면 친구관계가 아닌 사람들도 한 번씩 체크를 해주어야 하기 떄문에 TLE이 나는 문제였다.

문제는 다음과 같다.

                               [접근법]

  1. 우선 인접배열int v[2000][2000]이 아닌 vector<int>v[2000]을 생성해준다. (친구관계인 사람들만 보기 위해서)
  
  2. 그리고 방문처리가 되어있지 않은 친구로 들어가며 cnt+1을 해주고 만일 cnt>=5면 flag = true로 바꾸고 탐색을 종료한다.
                                     [코드]
#include <iostream>
#include <vector>
using namespace std;
vector<int>v[2000];
bool visit[2000];
int N, M, a, b;
bool flag = false;

void dfs(int idx, int cnt) {
	if (cnt >= 5) {
		flag = true;
		return;
	}
	for (int i = 0; i < v[idx].size(); i++) {
		if (!visit[v[idx][i]]) {
			visit[v[idx][i]] = true;
			dfs(v[idx][i], cnt + 1);
			if (flag) {
				return;
			}
			visit[v[idx][i]] = false;
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N >> M;

	for (int i = 0; i < M; i++) {
		cin >> a >> b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for (int i = 0; i < N; i++) {
		dfs(i, 0);
		if (flag) {
			cout << 1;
			return 0;
		}
	}
	cout << 0;
}