โจ Binary Search + BFS/DFS
https://www.acmicpc.net/problem/1939
1939๋ฒ: ์ค๋์ ํ
์ฒซ์งธ ์ค์ N, M(1 โค M โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ค๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ A, B(1 โค A, B โค N), C(1 โค C โค 1,000,000,000)๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ์ฌ๊ณผ B๋ฒ ์ฌ ์ฌ์ด์ ์ค๋์ ํ์ด
www.acmicpc.net
๐ ๊ณ ๋ คํด์ผํ ์
- ๋ ์ฌ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฆฌ๊ฐ ์๊ณ ์๋ฐฉํฅ์ด๋ค.
- ๊ณต์ฅ์ด ์๋ ๋ ์ฌ์ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก๊ฐ ๋ฐ๋์ ์กด์ฌํ๋ค. (๋ฐ๋์ ์กด์ฌํ๋ ๊ฒฝ๋ก์ ์ ๋ ฅ๊ฐ๋ง ์ฃผ์ด์ง)
- ์ฎ๊ธธ ์ ์๋ ๋ฌผํ์ ์ต๋ ์ค๋ ๊ตฌํ๊ธฐ
๐น๏ธ ํ์ด๊ณผ์
1๏ธโฃ ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๋ค๋ฆฌ ์ ๋ณด ์ ์ฅ (a์ฌ๊ณผ b์ฌ ์ฌ์ด์ ์ค๋์ ํ์ด c์ธ ๋ค๋ฆฌ)
2๏ธโฃ BFS/DFS๋ฅผ ํ์ฉํด์ ์ฌ์ ๋ฐฉ๋ฌธํ๋ฉฐ ์ต๋์ค๋(c)๊ณผ ๋น๊ตํ๋ฉด์ ๋ค๋ฆฌ๋ฅผ ์ง๋๊ฐ ์ ์๋์ง ํ์ ํ๋ค.
3๏ธโฃ ์ ๋ ฅ๋ ์ค๋ ์ ๋ณด๋ก ์ต์ ์ค๋๊ณผ ์ต๋ ์ค๋์ ์ด์ฉํด Binary Search ํ๋ฉด์ ํด๋น ์ค๋((์ต์+์ต๋)/2)์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์๋์ง ํ์ธํ๋ค.
ex)
1-2 โ 4
1-5 โ 2
3-5 โ 3
2-3 โ 5
3-4 โ 1 ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ์ผ ๋, ๊ณต์ฅ์ด 1๋ฒ ์ฌ๊ณผ 5๋ฒ ์ฌ์ ์๋ ๊ฒฝ์ฐ ์ด ๊ฒฝ๋ก์์ ์ต๋ ์ค๋์ ์ฐพ์ผ๋ฉด ๊ฒฐ๊ณผ๋ 3์ด ๋๋ค.
1 ๐ 2 ๐ 3 ๐ 5 ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ๋ 3, 4, 5์ ์ค๋์ผ๋ก ๊ฑด๋ ์ ์๊ณ ,
1 ๐ 5 ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ๋ 2์ ์ค๋์ผ๋ก ๊ฑด๋ ์ ์๋ค.
์ฒซ๋ฒ์งธ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ์ 3์ ์ค๋์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ผ๋ฏ๋ก(์ต๋์ค๋์ด 3์ธ ๋ค๋ฆฌ๋ฅผ 4 ๋๋ 5์ ์ค๋์ผ๋ก ๊ฑด๋ ์ ์์) ์ต๋ ์ค๋์ 3์ด ๋๊ณ ,
๋๋ฒ์งธ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ์ 2์ ์ค๋์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ผ๋ฏ๋ก ์ต๋ ์ค๋์ 2๊ฐ ๋๋ค.
2์ 3์ ๋น๊ตํ์ ๋ ๊ฒฐ๋ก ์ ์ผ๋ก ์ต๋์ค๋์ 3์ด ๋๋ฏ๋ก ๋ต์ด 3์ผ๋ก ์ถ๋ ฅ๋๋ค.
๐BFS
static boolean bfs(int weight){
Queue<Info> queue = new LinkedList<>();
boolean[] visit = new boolean[N+1]; // N๊ฐ์ ์ฌ
queue.add(new Info(x, 0)); // x๋ ๊ณต์ฅ์ด ์์นํด ์๋ ์ฌ์ ๋ฒํธ(์์)
while(!queue.isEmpty()){
Info now = queue.poll();
if(now.b==y) return true; // b๋ ์ฌ์ ๋ฒํธ. y๋ ๊ณต์ฅ์ด ์์นํด ์๋ ์ฌ์ ๋ฒํธ(๋)
for(Info next : queue[now.b]){
if(next.c>=weight && !visit[next.b]{
queue.add(next);
visit[next.b] = true;
}
}
}
return false;
}
๐ Binary Search
static void binarySearch(int l, int r){
while(l<=r){
int mid = (l+r)/2;
if(bfs(mid)){ // mid ์ค๋์ผ๋ก ๊ฑด๋ ์ ์๋ค๋ฉด
l = mid+1;
result = mid;
}else{
r = mid-1;
}
}
}
๐ฉโ๐ป ์ ์ฒด ์ฝ๋ - BFS + Binary Search
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
/**
* Binary Search
* BFS / DFS
*/
public class BOJ_1939_์ค๋์ ํ {
static int N, M;
static int x,y; // ๊ณต์ฅ์ด ์์นํด ์๋ ์ฌ์ ๋ฒํธ
static long total;
static ArrayList<Info>[] arr;
static class Info{
int b, c;
public Info(int b, int c) {
this.b = b;
this.c = c;
}
}
static boolean bfs(int weight){
Queue<Info> queue = new LinkedList<>();
boolean[] visit = new boolean[N + 1];
queue.add(new Info(x, 0));
while (!queue.isEmpty()) {
Info info = queue.poll();
if (info.b == y) {
return true;
}
for (Info next : arr[info.b]) {
if (next.c >= weight && !visit[next.b]) {
queue.add(next);
visit[next.b] = true;
}
}
}
return false;
}
static void binarySearch(int l, int r) {
while (l <= r) {
int mid = (r+l)/2;
if (bfs(mid)) {
l = mid + 1;
total = mid;
} else {
r = mid-1;
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int left = Integer.MAX_VALUE;
int right = Integer.MIN_VALUE;
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new ArrayList[N+1];
for (int i = 0; i <= N; i++) {
arr[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
arr[a].add(new Info(b, c));
arr[b].add(new Info(a, c));
left = Math.min(left, c); // ์ต์ ์ค๋
right = Math.max(right, c); // ์ต๋ ์ค๋
}
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken()); // ์์ ์ฌ
y = Integer.parseInt(st.nextToken()); // ๋์ฐฉ ์ฌ
binarySearch(left, right);
bw.write(String.valueOf(total));
bw.close();
br.close();
}
}
'์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 4179 ๋ถ! - Java (1) | 2023.10.25 |
---|---|
[BOJ] 14502 ์ฐ๊ตฌ์ - Java (0) | 2023.09.28 |
[BOJ] 3190 ๋ฑ (0) | 2023.09.25 |
[BOJ] 11657 ํ์๋จธ์ (1) | 2023.09.08 |
[BOJ] 1865 ์ํ (0) | 2023.09.08 |
โจ Binary Search + BFS/DFS
https://www.acmicpc.net/problem/1939
1939๋ฒ: ์ค๋์ ํ
์ฒซ์งธ ์ค์ N, M(1 โค M โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ค๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ A, B(1 โค A, B โค N), C(1 โค C โค 1,000,000,000)๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ์ฌ๊ณผ B๋ฒ ์ฌ ์ฌ์ด์ ์ค๋์ ํ์ด
www.acmicpc.net
๐ ๊ณ ๋ คํด์ผํ ์
- ๋ ์ฌ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฆฌ๊ฐ ์๊ณ ์๋ฐฉํฅ์ด๋ค.
- ๊ณต์ฅ์ด ์๋ ๋ ์ฌ์ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก๊ฐ ๋ฐ๋์ ์กด์ฌํ๋ค. (๋ฐ๋์ ์กด์ฌํ๋ ๊ฒฝ๋ก์ ์ ๋ ฅ๊ฐ๋ง ์ฃผ์ด์ง)
- ์ฎ๊ธธ ์ ์๋ ๋ฌผํ์ ์ต๋ ์ค๋ ๊ตฌํ๊ธฐ
๐น๏ธ ํ์ด๊ณผ์
1๏ธโฃ ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๋ค๋ฆฌ ์ ๋ณด ์ ์ฅ (a์ฌ๊ณผ b์ฌ ์ฌ์ด์ ์ค๋์ ํ์ด c์ธ ๋ค๋ฆฌ)
2๏ธโฃ BFS/DFS๋ฅผ ํ์ฉํด์ ์ฌ์ ๋ฐฉ๋ฌธํ๋ฉฐ ์ต๋์ค๋(c)๊ณผ ๋น๊ตํ๋ฉด์ ๋ค๋ฆฌ๋ฅผ ์ง๋๊ฐ ์ ์๋์ง ํ์ ํ๋ค.
3๏ธโฃ ์ ๋ ฅ๋ ์ค๋ ์ ๋ณด๋ก ์ต์ ์ค๋๊ณผ ์ต๋ ์ค๋์ ์ด์ฉํด Binary Search ํ๋ฉด์ ํด๋น ์ค๋((์ต์+์ต๋)/2)์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์๋์ง ํ์ธํ๋ค.
ex)
1-2 โ 4
1-5 โ 2
3-5 โ 3
2-3 โ 5
3-4 โ 1 ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ์ผ ๋, ๊ณต์ฅ์ด 1๋ฒ ์ฌ๊ณผ 5๋ฒ ์ฌ์ ์๋ ๊ฒฝ์ฐ ์ด ๊ฒฝ๋ก์์ ์ต๋ ์ค๋์ ์ฐพ์ผ๋ฉด ๊ฒฐ๊ณผ๋ 3์ด ๋๋ค.
1 ๐ 2 ๐ 3 ๐ 5 ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ๋ 3, 4, 5์ ์ค๋์ผ๋ก ๊ฑด๋ ์ ์๊ณ ,
1 ๐ 5 ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ๋ 2์ ์ค๋์ผ๋ก ๊ฑด๋ ์ ์๋ค.
์ฒซ๋ฒ์งธ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ์ 3์ ์ค๋์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ผ๋ฏ๋ก(์ต๋์ค๋์ด 3์ธ ๋ค๋ฆฌ๋ฅผ 4 ๋๋ 5์ ์ค๋์ผ๋ก ๊ฑด๋ ์ ์์) ์ต๋ ์ค๋์ 3์ด ๋๊ณ ,
๋๋ฒ์งธ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ ์ 2์ ์ค๋์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ผ๋ฏ๋ก ์ต๋ ์ค๋์ 2๊ฐ ๋๋ค.
2์ 3์ ๋น๊ตํ์ ๋ ๊ฒฐ๋ก ์ ์ผ๋ก ์ต๋์ค๋์ 3์ด ๋๋ฏ๋ก ๋ต์ด 3์ผ๋ก ์ถ๋ ฅ๋๋ค.
๐BFS
static boolean bfs(int weight){
Queue<Info> queue = new LinkedList<>();
boolean[] visit = new boolean[N+1]; // N๊ฐ์ ์ฌ
queue.add(new Info(x, 0)); // x๋ ๊ณต์ฅ์ด ์์นํด ์๋ ์ฌ์ ๋ฒํธ(์์)
while(!queue.isEmpty()){
Info now = queue.poll();
if(now.b==y) return true; // b๋ ์ฌ์ ๋ฒํธ. y๋ ๊ณต์ฅ์ด ์์นํด ์๋ ์ฌ์ ๋ฒํธ(๋)
for(Info next : queue[now.b]){
if(next.c>=weight && !visit[next.b]{
queue.add(next);
visit[next.b] = true;
}
}
}
return false;
}
๐ Binary Search
static void binarySearch(int l, int r){
while(l<=r){
int mid = (l+r)/2;
if(bfs(mid)){ // mid ์ค๋์ผ๋ก ๊ฑด๋ ์ ์๋ค๋ฉด
l = mid+1;
result = mid;
}else{
r = mid-1;
}
}
}
๐ฉโ๐ป ์ ์ฒด ์ฝ๋ - BFS + Binary Search
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
/**
* Binary Search
* BFS / DFS
*/
public class BOJ_1939_์ค๋์ ํ {
static int N, M;
static int x,y; // ๊ณต์ฅ์ด ์์นํด ์๋ ์ฌ์ ๋ฒํธ
static long total;
static ArrayList<Info>[] arr;
static class Info{
int b, c;
public Info(int b, int c) {
this.b = b;
this.c = c;
}
}
static boolean bfs(int weight){
Queue<Info> queue = new LinkedList<>();
boolean[] visit = new boolean[N + 1];
queue.add(new Info(x, 0));
while (!queue.isEmpty()) {
Info info = queue.poll();
if (info.b == y) {
return true;
}
for (Info next : arr[info.b]) {
if (next.c >= weight && !visit[next.b]) {
queue.add(next);
visit[next.b] = true;
}
}
}
return false;
}
static void binarySearch(int l, int r) {
while (l <= r) {
int mid = (r+l)/2;
if (bfs(mid)) {
l = mid + 1;
total = mid;
} else {
r = mid-1;
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int left = Integer.MAX_VALUE;
int right = Integer.MIN_VALUE;
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new ArrayList[N+1];
for (int i = 0; i <= N; i++) {
arr[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
arr[a].add(new Info(b, c));
arr[b].add(new Info(a, c));
left = Math.min(left, c); // ์ต์ ์ค๋
right = Math.max(right, c); // ์ต๋ ์ค๋
}
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken()); // ์์ ์ฌ
y = Integer.parseInt(st.nextToken()); // ๋์ฐฉ ์ฌ
binarySearch(left, right);
bw.write(String.valueOf(total));
bw.close();
br.close();
}
}
'์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 4179 ๋ถ! - Java (1) | 2023.10.25 |
---|---|
[BOJ] 14502 ์ฐ๊ตฌ์ - Java (0) | 2023.09.28 |
[BOJ] 3190 ๋ฑ (0) | 2023.09.25 |
[BOJ] 11657 ํ์๋จธ์ (1) | 2023.09.08 |
[BOJ] 1865 ์ํ (0) | 2023.09.08 |