https://www.acmicpc.net/problem/2026
2026번: 소풍
만약 K명의 친구 관계인 학생들이 존재하지 않는다면 -1을 출력한다. 그 외의 경우에는, K개의 줄에 학생들의 번호를 증가하는 순서로 한 줄에 한 개씩 출력한다. 여러 경우가 존재한다면 첫 번째
www.acmicpc.net
[난이도] Gold3
[유형] 백트래킹
[풀이]
인접행렬에 친구관계를 저장 해준 뒤, 재귀를 이용한 백트래킹을 해주면 됩니다.
현재까지 확정된 친구를 frd vector에 저장해준 뒤, 현재 친구가 될 수 있는지 확인중인 친구가
이 frd vector의 친구와 모두 친구인지 확인해서, 모두 친구이면 다음 함수를 호출해줍니다.
frd vector의 크기가 K(<=62)가 되면 조건을 만족하는 친구집합을 구한 것이므로 출력하고 종료해줍니다.
frd vector의 크기가 최대 62를 넘어갈 수 없으므로 시간내에 해결이 가능합니다.
#include <cstdio> #include <vector> using namespace std; int K,N,F,adj[901][901]; vector<int> frd; bool sol(int cur){ if(frd.size()==K) return 1; for(int i=cur+1;i<=N;i++){ bool ok=1; for(auto a : frd){ if(!adj[i][a]){ ok=0; break; } } if(ok) { frd.push_back(i); if(sol(i)) return 1; frd.pop_back(); } } return 0; } int main(){ scanf("%d%d%d",&K,&N,&F); while(F--){ int u,v; scanf("%d%d",&u,&v); adj[u][v]=adj[v][u]=1; } for(int i=1;i<=N;i++){ frd.push_back(i); if(sol(i)){ for(auto f : frd) printf("%d\n",f); return 0; } frd.clear(); } puts("-1"); }
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold3/2026.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold3] 12764 : 싸지방에 간 준하 (C++) (0) | 2022.02.20 |
---|---|
[BOJ/백준][Gold3] 12784 : 인하니카 공화국 (C++) (0) | 2022.02.20 |
[BOJ/백준][Gold3] 20057 : 마법사 상어와 토네이도 (C++) (0) | 2022.02.20 |
[BOJ/백준][Silver1] 1325 : 효율적인 해킹 (C++) (0) | 2022.02.20 |
[BOJ/백준][Silver5] 2947 : 나무 조각 (C++) (0) | 2022.02.20 |