프로그래밍/알고리즘
[알고리즘] 알고스팟 소풍 PICNIC
9/3
2019. 3. 22. 15:24
알고스팟 소풍 PICNIC
백트래킹으로 문제를 해결하였다.
보통 이런식으로 모든 방법의 수를 구하는 방법은 백트래킹으로 구하는 경우가 많은 것 같다.
이와 반대로 가장 먼저 도달하는 방법을 구하는 경우는 BFS가 많은 것 같은데... 이것도 더 익숙해져서 문제를 바로바로 어떤식으로 풀지 머릿 속에 나올 정도가 됐으면 좋겠다....
먼저 친구관계를 저장해줄 friends
라는 이차원 boolean
배열을 만들어서 친구관계를 저장하였고, 짝이 정해졌는 지 확인해줄 visited
라는 boolean
배열도 만들어 주었다.
이 후 재귀함수를 만들어서 아직 짝이 없는 친구들을 짝을 주어지는 식으로 백트래킹을 해줬다.
구현 코드는 아래와 같다.
/**
* https://algospot.com/judge/problem/read/PICNIC
* 알고스팟 피크닉 PICNIC
*/
public class Picnic {
static BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
static int N = 0;
static int M = 0;
static int count = 0;
static boolean[][] friends;
static boolean[] visited;
public static void main(String[] args) throws IOException {
int C = Integer.parseInt(br.readLine().trim());
while(C-->0){
count= 0;
solution();
System.out.println(count);
}
}
private static void solution() throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
friends = new boolean[N][N];
visited = new boolean[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
int person1 = Integer.parseInt(st.nextToken());
int person2 = Integer.parseInt(st.nextToken());
friends[person1][person2] = true;
friends[person2][person1] = true;
}
dfs();
}
private static void dfs() {
int person = findNotQueue();
if(person<0){
count++;
return;
}
for (int i = 0; i < N; i++) {
if(i == person) continue;
if(friends[person][i] && !visited[i]){
visited[person] = true;
visited[i] = true;
dfs();
visited[person] = false;
visited[i] = false;
}
}
}
private static int findNotQueue() {
for (int i = 0; i < N; i++) {
if(!visited[i]) return i;
}
return -1;
}
}