https://www.acmicpc.net/problem/20168
๋ฌธ์
์์ฏ์ ํธ์์ด๋ ๊ณจ๋ชฉ ๋์ฅ์ ์ถ์ ์ด์๋ค. ํธ์์ด๊ฐ ์ด๋ ๋ง์์ N ๊ฐ์ ๊ต์ฐจ๋ก์ M ๊ฐ์ ๊ณจ๋ชฉ์ด ์์๋ค. ๊ต์ฐจ๋ก์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N ๋ฒ๊น์ง๋ก ํํํ๋ค. ๊ณจ๋ชฉ์ ์๋ก ๋ค๋ฅธ ๋ ๊ต์ฐจ๋ก๋ฅผ ์๋ฐฉํฅ์ผ๋ก ์ด์ด์ฃผ๋ฉฐ ์์์ ๋ ๊ต์ฐจ๋ก๋ฅผ ์๋ ๊ณจ๋ชฉ์ ์ต๋ ํ ๊ฐ๋ง ์กด์ฌํ๋ค. ๋ถ์ ์ ์ ์ฐ๋ ํธ์์ด๋ ๋ชจ๋ ๊ณจ๋ชฉ์ ์์ ์ ๋ถ์ ์ ๋์๊ณ , ๊ณจ๋ชฉ๋ง๋ค ํต๊ณผํ๋ ์ฌ๋์๊ฒ ์๊ธํ ๊ฒ์ด๋ค. ์๊ธํ๋ ์๊ธ์ ๊ณจ๋ชฉ๋ง๋ค ๋ค๋ฅผ ์ ์๋ค.
๋น์ ์ A ๋ฒ ๊ต์ฐจ๋ก์์ B ๋ฒ ๊ต์ฐจ๋ก๊น์ง C ์์ ๊ฐ์ง๊ณ ๊ฐ๋ ค๊ณ ํ๋ค. ํธ์์ด์ ํกํฌ๋ฅผ ๋ณด๋ฉฐ ์ง์ฆ์ ๋์ง๋ง, ๋ถ์ ์ ์ ์ด๊ฒจ๋ผ ๋ฐฉ๋ฒ์ด ์์ด์ ๋์ ๋ด๊ณ ๊ฐ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ์ด์ ์ง๋๊ฐ ๊ฑฐ๋ฉด, ์ต์ํ์ ์์น์ฌ์ ๋ฐ๊ณ ์ถ๋ค. ๋น์ ์ด ๋ฐ๋ ์์น์ฌ์ ๊ฒฝ๋ก ์์์ ๊ฐ์ฅ ๋ง์ด ๋ธ ๋์ ๋น๋กํ๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ตญ ๊ฐ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค ์ค์์ ์ต์ํ์ ์์น์ฌ์ ๋ฐ์ผ๋ ค๊ณ ํ๋ค. ์ฆ, ํ ๊ณจ๋ชฉ์์ ๋ด์ผ ํ๋ ์ต๋ ์๊ธ์ ์ต์ํํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 5๊ฐ์ ๊ต์ฐจ๋ก์ 5๊ฐ์ ๊ณจ๋ชฉ์ด ์์ผ๋ฉฐ, ๋น์ ์ด 1๋ฒ ๊ต์ฐจ๋ก์์ 3๋ฒ ๊ต์ฐจ๋ก๋ก ๊ฐ๊ณ ์ถ์ ์ํฉ์ด๋ผ๊ณ ํ์. ๋ง์ฝ 10์์ ๋ค๊ณ ์ถ๋ฐํ๋ค๋ฉด 2๊ฐ์ง ๊ฒฝ๋ก๋ก ๊ฐ ์ ์๋ค. 1๋ฒ -> 2๋ฒ -> 3๋ฒ ๊ต์ฐจ๋ก๋ก ์ด๋ํ๊ฒ ๋๋ฉด ์ด 10์์ด ํ์ํ๊ณ ์ด ๊ณผ์ ์์ ์ต๋ ์๊ธ์ก์ 5์์ด์๊ณ , 1๋ฒ -> 4๋ฒ -> 5๋ฒ -> 3๋ฒ ๊ต์ฐจ๋ก๋ก ์ด๋ํ๊ฒ ๋๋ฉด ์ด 8์์ด ํ์ํ๋ฉฐ ์ต๋ ์๊ธ์ก์ 6์์ด ๋๋ค. ์ต์ํ์ ์์น์ฌ์ ์ป๋ ๊ฒฝ๋ก๋ ์ต๋ ์๊ธ์ก์ด 5์ธ ๊ฒฝ๋ก์ด๋ค. ํ์ง๋ง ๋ง์ฝ 8์๋ฐ์ ์๋ค๋ฉด, ์ ์์ ๊ฒฝ๋ก๋ ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ต๋ ์๊ธ์ก์ด 6์์ธ ๊ฒฝ๋ก๋ก ๊ฐ์ผ ํ๋ ๊ฒ์ด ์ต์ ์ด๋ค.
๋น์ ์ ์์ ์์ ๋ฅผ ํตํด์, ์์น์ฌ์ ์ค์ด๊ณ ์ถ์ ์๋ก ๊ฐ๊ฑฐ๋ ๋ ๋ง์ ๋์ด ํ์ํ๊ณ , ์์น์ฌ์ ๋ ๋ฐ๋ ๊ฒ์ ๊ฐ์ํ๋ฉด ๊ฐ๊ฑฐ๋ ๋ ์ ์ ๋์ด ํ์ํ๊ฒ ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๋ง์์ ์ง๋์ ๊ณจ๋ชฉ๋ง๋ค ์กด์ฌํ๋ ํธ์์ด๊ฐ ์๊ธํ๋ ๊ธ์ก์ ์๋ค๋ฉด, ๋น์ ์ด ํ ๊ณจ๋ชฉ์์ ๋ด์ผํ๋ ์ต๋ ์๊ธ์ ์ต์๊ฐ์ ๊ณ์ฐํ์. ๋ง์ฝ ์ง๊ธ ๊ฐ์ง ๋์ผ๋ก๋ ์ ๋๋ก ๋ชฉํ ์ง์ ์ ๊ฐ ์ ์๋ค๋ฉด -1 ์ ์ถ๋ ฅํ๋ผ.
์ ๋ ฅ
์ฒซ ์ค์ ๊ต์ฐจ๋ก ๊ฐ์ N, ๊ณจ๋ชฉ ๊ฐ์ M, ์์ ๊ต์ฐจ๋ก ๋ฒํธ A, ๋์ฐฉ ๊ต์ฐจ๋ก ๋ฒํธ B, ๊ฐ์ง ๋ C ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ์ด์ด์ M ๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๊ฐ ๊ณจ๋ชฉ์ด ์๋ ๊ต์ฐจ๋ก 2๊ฐ์ ๋ฒํธ์, ๊ณจ๋ชฉ์ ์๊ธ์ก์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๊ฐ์ ๊ต์ฐจ๋ก๋ฅผ ์๋ ๊ณจ๋ชฉ์ ์ต๋ ํ ๋ฒ๋ง ์ฃผ์ด์ง๋ฉฐ, ๊ณจ๋ชฉ์ ์๋ฐฉํฅ์ด๋ค.
์ถ๋ ฅ
ํธ์์ด๊ฐ ์งํค๊ณ ์๋ ๊ณจ๋ชฉ๋ค์ ํตํด์ ์์ ๊ต์ฐจ๋ก์์ ๋์ฐฉ ๊ต์ฐจ๋ก๊น์ง C ์ ์ดํ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ค ์ค์, ์ง๋๋ ๊ณจ๋ชฉ์ ์๊ธ์ ์ต๋๊ฐ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ผ. ๋ง์ฝ ๊ฐ ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์ ํ ์ฌํญ
- 1 ≤ N ≤ 10
- 1 ≤ M ≤ N × (N-1) / 2
- 1 ≤ C ≤ 10,000
- 1 ≤ ๊ณจ๋ชฉ ๋ณ ์๊ธ์ก ≤ 1,000
- 1 ≤ A, B ≤ N, A ≠ B
- ๊ณจ๋ชฉ์ด ์๋ ๊ต์ฐจ๋ก์ ๋ฒํธ๋ ์๋ก ๋ค๋ฅด๋ค.
ํ์ด
๊ฐ๋จํ DFS๋ก ํด๊ฒฐ ๐ค
A -> B ๊น์ง C ๊ธ์ก ๋ด์์ ๊ฐ ์ ์๋ ๊ฒฝ๋ก ์ค์์ " ์ต๋ ๊ธ์ก์ด ๊ฐ์ฅ ์ต์๊ฐ์ธ " ๊ฒฝ๋ก์ ์ต๋ ๊ธ์ก์ ๊ตฌํ๋ ๋ฌธ์
DFS๋ก ์ธ์ ํ ๊ต์ฐจ๋ก๋ค ์ค ๊ฐ์ง๊ณ ์๋ ๊ธ์ก์์ ๊ฐ ์ ์๋ ๊ต์ฐจ๋ก๋ค์ ์ง๋๊ฐ๋ค.
์ง๋๊ฐ๋ฉด์ ๊ฐ์ฅ ๋ง์ด ๋ธ ๊ธ์ก ๋ํ ์ ์ฅ โผ๏ธ
B์ ๋์ฐฉํ๋ฉด ๐ ์ ์ฅํด๋์ ์ต๋ ๊ธ์ก๊ณผ ์ด์ ์ ๊ฐ์ ๋น๊ตํด์ ์ต์๊ฐ์ ๊ตฌํ๋ค.
answer ๊ฐ ์ด๊ธฐ๊ฐ ๊ทธ๋๋ก๋ผ๋ฉด ๐ ๊ฒฝ๋ก๊ฐ ์๋ค๋ ๊ฒ์ผ๋ก -1 ์ถ๋ ฅ โผ๏ธ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main_BOJ_20168_๊ณจ๋ชฉ๋์ฅํธ์ {
static class road{
int from;
int to;
int cost;
road(int from, int to, int cost){
this.from = from;
this.to = to;
this.cost = cost;
}
}
static int N, M, A, B, C;
static ArrayList<road> adj[];
static boolean[] isVisited;
static int answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
A = Integer.parseInt(stringTokenizer.nextToken());
B = Integer.parseInt(stringTokenizer.nextToken());
C = Integer.parseInt(stringTokenizer.nextToken());
adj = new ArrayList[N+1];
for(int i = 0 ; i < N+1; i++){
adj[i] = new ArrayList<>();
}
isVisited = new boolean[N+1];
answer = Integer.MAX_VALUE;
for(int i = 0 ; i < M ; i++){
stringTokenizer = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stringTokenizer.nextToken());
int b = Integer.parseInt(stringTokenizer.nextToken());
int c = Integer.parseInt(stringTokenizer.nextToken());
adj[a].add(new road(a, b, c));
adj[b].add(new road(b, a, c));
}
isVisited[A] = true;
DFS(A, C, -1);
answer = answer == Integer.MAX_VALUE ? -1 : answer;
System.out.println(answer);
}
private static void DFS(int nowNode, int haveMoney, int maxCost) {
if(nowNode == B){
answer = Math.min(answer, maxCost);
return;
}
if(haveMoney <= 0)
return;
for(road nextNode : adj[nowNode]){
if(!isVisited[nextNode.to] && nextNode.cost <= haveMoney){
isVisited[nextNode.to] = true;
DFS(nextNode.to, haveMoney - nextNode.cost, Math.max(nextNode.cost, maxCost));
isVisited[nextNode.to] = false;
}
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค / BOJ 2469 ] ์ฌ๋ค๋ฆฌ ํ๊ธฐ ( ์๋ฐ / JAVA ) (0) | 2021.10.19 |
---|---|
[ ๋ฐฑ์ค / BOJ 1987 ] ์ํ๋ฒณ ( ์๋ฐ / JAVA ) (0) | 2021.10.19 |
[ ๋ฐฑ์ค / BOJ 2374 ] ๊ฐ์ ์๋ก ๋ง๋ค๊ธฐ ( JAVA / ์๋ฐ ) (0) | 2021.10.11 |
[ ๋ฐฑ์ค / BOJ 1080 ] ํ๋ ฌ ( JAVA / ์๋ฐ ) (0) | 2021.10.11 |
[ ๋ฐฑ์ค / BOJ 20551 ] Sort ๋ง์คํฐ ๋ฐฐ์งํ์ ํ๊ณ์ ( JAVA / ์๋ฐ ) (0) | 2021.10.11 |