-
[Algo Rhythm๐บ๐]BOJ 14889 - ์คํํธ์ ๋งํฌAlgo Rhythm๐บ๐/BOJ 2021. 6. 18. 23:44
๋ฌธ์ ๋ถ์
์คํํธํ์ Tstart, ๋งํฌํ์ Tlink ๊ทธ๋ฆฌ๊ณ ๋ ํ์ ๋ฅ๋ ฅ์น๋ฅผ ๊ฐ๊ฐ Sstart,Slink๋ผ๊ณ ํ์. ์ด๋ ๊ฐ ํ์ ์ํ๋ ์ฌ๋๋ค์ ์๋ ๋ ํ ๋ชจ๋ ์ถ๊ตฌ๋ฅผ ํ๋ N (4โคNโค20)๋ช ์ ์ ๋ฐ์ธ N/2 ๋ช ์ด๋ค.
๋ฌธ์ ์์ ์๊ตฌํ๋ min(|SstartโSlink|)๋ฅผ ๊ตฌํ๊ธฐ ์ํ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ (Tstart,Tlink)์ ๋ชจ๋ ์กฐํฉ์ ๊ตฌํ ๋ค ๊ฐ ์กฐํฉ์ |SstartโSlink|์ ๊ตฌํ๊ณ ๊ทธ ์ค ์ต์๊ฐ์ ์ฐพ๋ ๊ฒ์ด๋ค.
๋ชจ๋ ์กฐํฉ์ ๊ตฌํด์ผ ํ๋ ๋ฌธ์ ๋ค์ ์ฃผ๋ก 'backtracking'์ ์ฌ์ฉํ๋ค. ์ด ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก backtracking์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๋ค.
๋ฌธ์ ํ์ด
์ถ๊ตฌ๋ฅผ ํ๋ ์ฌ๋๋ค๋ง๋ค ๊ณ ์ ์ id๊ฐ ์๊ณ ๊ทธ๊ฒ๋ค์ ๊ฐ๊ฐ 1, 2, ... , N์ด๋ผ๊ณ ํ์. ๊ทธ๋ฆฌ๊ณ ๊ฐ id๋ฅผ ํ๋์ vertex๋ผ๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ (Tstart,Tlink)์ ๋ชจ๋ ์กฐํฉ์ ๊ตฌํ๋ ๋ฌธ์ ๊ฐ ๊ฒฐ๊ตญ (์ ํํ N / 2๊ฐ์ vertex, ์ ํํ์ง ์์ N / 2๊ฐ์ vertex)์ ๋ชจ๋ ์กฐํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ ๊ฐ๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค. vetex๋ค์ ์ ํํ ๋๋ ์ด๋ฏธ ์ ํ๋์ง ์์ vertex๋ค๋ง ์ ํํ๊ณ ์ด๋ ์ฐ์ด๋ ์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
f(id,nmember,N)={calc |SstartโSlink| and compareif nmember==N/2(base case)f(id+1,nmember+1,N)else if vertexid+1 is not visited(recursive case)โ
์ด๋ ์ฃผ์ํ ์ ์ ๋ชจ๋ ์กฐํฉ์ ๊ตฌํ๊ธฐ ์ํด 1๋ถํฐ N๊น์ง backtrackingํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ์๋ํ๋ฉด N / 2๊ฐ์ vertex๋ง ์ ํํ๋ฉด ๋๋จธ์ง N / 2๊ฐ์ vertex๋ค์ ์๋์ผ๋ก ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ N / 2๊ฐ์ vertex๋ง backtrackingํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ๊ตฌํํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด 4๊ฐ์ vertex ์ค 2๊ฐ๋ฅผ ์ ํํ๋ฉด ๊ฐ๋ฅํ ์กฐํฉ์ (1,2),(1,3),(1,4),(2,3),(2,4),(3,4)์ด๋ ๊ฒ 6๊ฐ์ด๋ค. ํ์ง๋ง (1,2) ์ ํ์ ์ ํ๋์ง ์๋ vertex๋ค์ ์์ฐ์ค๋ฝ๊ฒ (3,4)๊ฐ ๋๋ ๊ฒ์ ์ ์ ์๋ค.
๋ณต์ก๋ ๋ถ์
n๋ช ์ ์ฌ๋๋ค์ด ์ถ๊ตฌ๋ฅผ ํ๋ค๊ณ ํ ๋ ๋ณต์ก๋๋ ์๋์ ๊ฐ๋ค.
์๊ฐ ๋ณต์ก๋ : O(n!)
- recursive call์ i๋ฒ ํ์ ๋ ๊ฐ recursive call๋ง๋ค ์ ํํ ์ ์๋ id ์ฆ, vertex๊ฐ Nโi๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ณต๊ฐ ๋ณต์ก๋ : O(n2)
- ๊ฐ์ ํ์ผ๋ ๋ฅ๋ ฅ์น๋ฅผ ๊ธฐ๋กํ 2์ฐจ์ ๋ฐฐ์ด : O(n2)
- n๊ฐ์ vertex์ ๋ํ visit ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฐ์ด : O(n)
- Tstart,Tlink์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ vertor : O(n)
์ฝ๋
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <cstdio> #include <cstring> #include <climits> #include <cstdlib> #include <algorithm> #include <vector> #define MAX_NUM 20 using namespace std; vector<int> team_start; vector<int> team_link; int S[MAX_NUM + 1][MAX_NUM + 1]; bool visited[MAX_NUM + 1]; int ans = INT_MAX; void backtrack(int id, int n_member, int N) { if (n_member == N / 2) { int S_start = 0, S_link = 0; int mem_i, mem_j; for (int i = 1; i <= N; i++) { if (visited[i]) team_start.push_back(i); else team_link.push_back(i); } for (int i = 0; i < team_start.size(); i++) { mem_i = team_start[i]; for (int j = i + 1; j < team_start.size(); j++) { mem_j = team_start[j]; S_start += (S[mem_i][mem_j] + S[mem_j][mem_i]); } } for (int i = 0; i < team_link.size(); i++) { mem_i = team_link[i]; for (int j = i + 1; j < team_link.size(); j++) { mem_j = team_link[j]; S_link += (S[mem_i][mem_j] + S[mem_j][mem_i]); } } ans = min(ans, abs(S_start - S_link)); team_start.clear(); team_link.clear(); return; } for (int i = id + 1; i <= N; i++) { if (!visited[i]) { visited[i] = true; backtrack(i, n_member + 1, N); visited[i] = false; } } } int main() { int N, _s; memset(visited, false, sizeof(visited)); scanf("%d", &N); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%d", &_s); S[i][j] = _s; } } for (int i = 1; i < N / 2; i++) { visited[i] = true; backtrack(i, 1, N); visited[i] = false; } printf("%d", ans); return 0; } ๋ฌธ์ ์ถ์ฒ ๋ฐ ์๋ณธ ๋ฌธ์
https://www.acmicpc.net/problem/14889
14889๋ฒ: ์คํํธ์ ๋งํฌ
์์ 2์ ๊ฒฝ์ฐ์ (1, 3, 6), (2, 4, 5)๋ก ํ์ ๋๋๋ฉด ๋๊ณ , ์์ 3์ ๊ฒฝ์ฐ์๋ (1, 2, 4, 5), (3, 6, 7, 8)๋ก ํ์ ๋๋๋ฉด ๋๋ค.
www.acmicpc.net
https://www.notion.so/BOJ-14889-cb96bb89dce24aa88b7b955bc050c074
BOJ 14889 - ์คํํธ์ ๋งํฌ
๋ฌธ์ ๋ถ์
www.notion.so
'Algo Rhythm๐บ๐ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algo Rhythm๐บ๐]BOJ 14888 - ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) 2021.06.22 [Algo Rhythm๐บ๐]BOJ 20170 - Commemorative Dice (0) 2021.06.21 [Algo Rhythm๐บ๐]BOJ 1620 - ์ ์ ํ๋ด2 (0) 2021.03.12 [Algo Rhythm๐บ๐]BOJ 14501 - ํด์ฌ (0) 2021.03.11 [Algo Rhythm๐บ๐]BOJ 13458 - ์ํ๊ฐ๋ (0) 2021.03.09