๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/6086
ํ์ด
์๋๋ชฌ๋-์นดํ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๋ฌธ์ ์๋ค.
์ฒ์ ๋ณด๋ ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ์ข ํ๋ค์์ง๋ง, ๋ฌธ์ ๋ฅผ ํ๊ณ ๋๋ ์ด๋ค ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ์ธ์ง ๊ฐ์ ์ก์ ์ ์์๋ค.
- (BFS๋ฅผ ํตํด ์์์ ์์ ๋์ฐฉ์ ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค. (๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก, ์ค๊ฐ์ ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ฅผ ๊ธฐ๋กํด์ผ ํ๋ค)
- ๋์ฐฉ์ ์ ๋๋ฌํ๋ฉด BFS๋ฅผ ์ข ๋ฃํ๊ณ , ๋์ฐฉ์ ์์ ์์์ ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ๊ฑฐ์ฌ๋ฌ ๊ฐ๋ฉฐ ์ต๋ ์ ๋์ ๊ตฌํ๋ค.
- ๋์ฐฉ์ ์์ ์์์ ๊น์ง ๋ค์ ๊ฑฐ์ฌ๋ฌ๊ฐ๋ฉด์ ํ์ดํ์ ์์ฌ ์ฉ๋์ ๊ฐฑ์ ํ๋ค. (ํ์ดํ์ ์์ฌ ์ฉ๋ = ํ์ดํ์ ๊ธฐ์กด ์ฉ๋ - (2)์์ ๊ตฌํ ์ต๋ ์ ๋)
์์์ ~๋์ฐฉ์ ๊น์ง์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์ ๋๊น์ง 1~3์ ๋ฐ๋ณตํ๋ค. ์ต๋ ์ ๋์ ๋์ ํฉ์ด ์ ๋ต์ด ๋๋ค.
์์ํ ๋ด์ฉ์ ๋นผ๊ณ ์ ๋ฆฌํ๋ฉด ์์ ๊ฐ์ด ์์ฝํ ์ ์์ ๊ฒ ๊ฐ๋ค.
(0) ์ ๋ ฅ ๋ฐ๊ธฐ
์ ๋ ฅ ๋ฐ๊ธฐ ํํธ๋ฅผ ๋ฐ๋ก ์์ฑํ๋ ์ด์ ?
^^...!
๋ญ๊ฐ ๋ฌธ์ ์ง? ์ถ์๋๋ฐ ์ํ๋ฒณ์ด ์๋ฌธ์์ผ ์๋ ์๋ค๋ ๊ฑธ ๊นจ๋ฌ์๋ค.
A๋ a๋ ๋ค๋ฅธ ๋
ธ๋์๋ ๊ฑฐ์์.
static int N, MAX = 52, START = 0, END = 'Z'-'A';
static int[][] pipe = new int[MAX][MAX];
static int charToInt(char c) {
if('A'<=c && c<='Z') return c-'A';
if('a'<=c && c<='z') return c-'a'+26;
return -1;
}
ํ์ดํ์ ์์ฌ ์ฉ๋์ ์ธ์ ํ๋ ฌ๋ก ์ ์ฅํ๊ณ , charํ์ intํ์ผ๋ก ๋ณํํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ๋ ธ๋์ ์ด๋ฆ์ด ์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋ ์ ์๊ฒ ํ๋ค.
์ ๋ ฅ๋ฐ์๋ ์ฃผ์ํด์ผ ํ ์ ์ด ๋ ํ๋ ์๋๋ฐ, ์๋ฐฉํฅ ๊ทธ๋ํ์ด๊ธฐ ๋๋ฌธ์ pipe[a][b]=3 ์ด๋ฉด pipe[b][a]๋ 3์ด๋ค.
(1) BFS๋ฅผ ํตํด ์์์ ~ ๋์ฐฉ์ ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
static void bfs(int start, int end) {
Queue<Integer> q = new ArrayDeque<>();
q.add(start);
prev[start] = start; // ์์์ ์ ํ์ push
while(!q.isEmpty()) {
int now = q.poll();
if(now==end) break;
for (int next=0; next<pipe[now].length; next++) {
// ํ์ดํ ์ฉ๋์ด ๋จ์์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์๋ ๋
ธ๋๋ผ๋ฉด ํ์ push
if(pipe[now][next]>0 && prev[next]==-1) {
q.add(next);
prev[next] = now;
}
}
}
}
์ผ๋ฐ์ ์ธ BFS์ ๋ค๋ฅธ ์ ์ (1) ์ฉ๋์ด ๊ฝ ์ฐฌ ํ์ดํ๋ ์ง๋๊ฐ ์ ์์ผ๋ฉฐ, (2) ์ง๋์จ ๊ฒฝ๋ก๊ฐ ํ์ํ๋ค๋ ์ ์ด๋ค. ๊ทธ๋์ ์ง์ ์ ๋ฐฉ๋ฌธํ๋ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด prev
๋ฅผ ์ ์ธํ์ฌ -1๋ก ์ด๊ธฐํํ ๋ค์,๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐ ๊ฒฝ๋ก ๊ธฐ๋ก์ฉ์ผ๋ก ์ฌ์ฉํ๋ค.
(2) ์ต๋ ์ ๋ ๊ตฌํ๊ธฐ
int water = Integer.MAX_VALUE;
int now = end;
while(now!=start) {
water = Math.min(pipe[prev[now]][now], water);
now = prev[now];
}
์ด์ ๋์ฐฉ์ ์์ ์์์ ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์, ํ์ดํ์ ์ต์ ์์ฌ ์ฉ๋์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
์ด์ ๋
ธ๋์์ ํ์ฌ ๋
ธ๋๋ก ์ค๋ ํ์ดํ์ ์์ฌ ์ ๋๊ณผ, ๋ด๊ฐ ๊ฐ๊ณ ์๋ ์ต๋ ์ ๋๊ฐ์ ๋น๊ตํด์ฃผ๋ฉฐ ๊ฐฑ์ ํ๋ค.
(3) ํ์ดํ์ ์์ฌ ์ฉ๋ ๊ฐฑ์
now = end;
while(now!=start) {
pipe[prev[now]][now]-=water;
pipe[now][prev[now]]+=water;
now = prev[now];
}
์ด์ ๋์ฐฉ์ ์์ ์์์ ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ํ์ดํ์ ์์ฌ ์ฉ๋์ ๊ฐฑ์ ํด์ค ์ฐจ๋ก์ด๋ค.
์กฐ๊ธ ์ด๋ ค์ธ ์๋ ์๋ ๋ถ๋ถ์ธ๋ฐ, ์ ๋์ ๋ฐฉํฅ์ด ์กด์ฌํ๋ค.
A → B๋ก 2๋งํผ์ ๋ฌผ์ด ํ๋ฅด๊ณ ์๊ณ , B → A๋ก 3๋งํผ์ ๋ฌผ์ด ํ๋ฅด๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
A → B๋ก ํ๋ฅด๋ ๋ฌผ๊ณผ B → A๋ก ํ๋ฅด๋ ๋ฌผ์ด ์์๋์ด, ๊ฒฐ๊ตญ์๋ B → A๋ก 1๋งํผ์ ๋ฌผ์ด ํ๋ฅด๋ ์ํ๊ฐ ๋๋ค.
์ด๊ฑธ ํ์ดํ์ ์์ฌ ์ฉ๋์ ๋ฐ์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
pipe[a][b] = 3 ์ด๊ณ , pipe[b][a] = 3์ธ ์ํฉ์ ์๊ฐํด๋ณด์. ์ด ์ํฉ์์ a → b๋ก 2๋งํผ์ ๋ฌผ์ด ํ๋ฅด๊ธฐ ์์ํ๋ค๋ฉด?
a → b ํ์ดํ์๋ 1๋งํผ์ ๋ฌผ์ด ํ๋ฅผ ์ ์๊ฒ ์ง๋ง, b → a์๋ 5๋งํผ์ ๋ฌผ์ด ํ๋ฅผ ์ ์๊ฒ ๋๋ค. ๋ฌผ์ ์ฉ๋์ด 3์ ๋์ด๊ฐ๋, a → b๋ก ํ๋ฅด๋ ๋ฌผ์ด ์์ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ๋
ธ๋ → ํ์ฌ ๋
ธ๋ ํ์ดํ์ ์ฉ๋์์ water
๋งํผ์ ๋บ๋ค๋ฉด, ํ์ฌ ๋
ธ๋ → ์ด์ ๋
ธ๋ ํ์ดํ์ ์ฉ๋์๋ water
๋งํผ ๋ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ต์ ๋งค๋ฒ ๊ตฌํ water
๋ค์ ๋ํ ๊ฐ์ด ๋๋ค.
์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_6086_์ต๋์ ๋ {
static int N, MAX = 52, START = 0, END = 'Z'-'A';
static int[][] pipe = new int[MAX][MAX];
static int[] prev = new int[MAX];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
for (int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = charToInt(st.nextToken().charAt(0));
int b = charToInt(st.nextToken().charAt(0));
int width = Integer.parseInt(st.nextToken());
pipe[a][b] += width;
pipe[b][a] += width;
}
int answer = 0;
while(true) {
// ์ด์ ์ ๊ตฌํ ๊ฒฝ๋ก๊ฐ ๋จ์์์ผ๋ฉด ์๋๋ฏ๋ก, ๋งค๋ฒ ์ด๊ธฐํ
Arrays.fill(prev, -1);
bfs(START,END);
// ๋์ฐฉ์ ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด ๋ฐ๋ณต๋ฌธ ํ์ถ
if(prev[END]==-1) break;
answer += calculateFlow(START,END);
}
System.out.println(answer);
}
static void bfs(int start, int end) {
Queue<Integer> q = new ArrayDeque<>();
q.add(start);
prev[start] = start;
while(!q.isEmpty()) {
int now = q.poll();
if(now==end) break;
for (int next=0; next<pipe[now].length; next++) {
if(pipe[now][next]>0 && prev[next]==-1) {
q.add(next);
prev[next] = now;
}
}
}
}
static int calculateFlow(int start, int end) {
int water = Integer.MAX_VALUE;
int now = end;
while(now!=start) {
water = Math.min(pipe[prev[now]][now], water);
now = prev[now];
}
now = end;
while(now!=start) {
pipe[prev[now]][now]-=water;
pipe[now][prev[now]]+=water;
now = prev[now];
}
return water;
}
static int charToInt(char c) {
if('A'<=c && c<='Z') return c-'A';
if('a'<=c && c<='z') return c-'a'+26;
return -1;
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฝ๋ฉ ํ ์คํธ ๊ณต๋ถ (0) | 2023.08.31 |
---|---|
[๋ฐฑ์ค 10942] ํฐ๋ฆฐ๋๋กฌ? (0) | 2023.08.31 |
[๋ฐฑ์ค 1062] ๊ฐ๋ฅด์นจ (0) | 2023.08.28 |
[๋ฐฑ์ค 2342] Dance Dance Revolution (0) | 2023.08.27 |
[๋ฐฑ์ค 16235] ๋๋ฌด ์ฌํ ํฌ (1) | 2023.08.27 |