득이공간
[백준 C++] 2026 소풍 - 백트래킹 본문
문제풀이
백트래킹을 이용해서 푸는 문제입니다.
먼저 각 학생의 친구 수를 저장하는 배열과
모든 학생에 대해서 친구인지 아닌지를 저장하는 2차원 배열을 생성했습니다.
그리고 백트래킹을 이용해서 1부터 N번의 학생까지 K-1 이상의 친구를 보유한 학생을 선택해서
K명을 선택했을 때 모두 서로 친구라는 조건이 만족하면 출력 & 종료하도록 했습니다.
코드
#include <iostream>
using namespace std;
int N, K, F;
int FN[901];
bool Friend[901][901];
int Sel[62];
bool Check()
{
for (int i = 0; i < K - 1; ++i)
{
for (int j = i + 1; j < K; ++j)
{
if (!Friend[Sel[i]][Sel[j]])
{
return false;
}
}
}
return true;
}
void DFS(int Idx, int Num)
{
if (Idx == K)
{
if (Check())
{
for (int i = 0; i < K; ++i)
{
cout << Sel[i] << '\n';
}
exit(0);
}
return;
}
if (Num > N)
{
return;
}
if (FN[Num] >= K - 1)
{
Sel[Idx] = Num;
DFS(Idx + 1, Num + 1);
}
DFS(Idx, Num + 1);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> K >> N >> F;
for (int i = 0; i < F; ++i)
{
int A, B;
cin >> A >> B;
++FN[A];
Friend[A][B] = true;
++FN[B];
Friend[B][A] = true;
}
DFS(0, 1);
cout << -1;
}
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 C++] 1261 알고스팟 - 다익스트라 (0) | 2024.04.30 |
---|---|
[백준 C++] 10473 인간 대포 - 다익스트라 (0) | 2024.04.28 |
[백준 C++] 15683 감시 - 백트래킹 (0) | 2024.04.26 |
[백준 C++] 2470 두 용액 - 이분탐색 (0) | 2024.04.25 |
[백준 C++] 16234 인구 이동 - 너비우선탐색 (1) | 2024.04.24 |