dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 기록
  • 반성
  • 프로그래머스 SQL
  • 스프링
  • AI Tech
  • HackerRank mysql
  • 백준 DP
  • 서블릿
  • 네이버 부스트캠프
  • 일기
  • 부스트캠프
  • BFS
  • dp
  • c++
  • 회고
  • Baekjoon
  • 프로그래머스
  • 백준
  • Hackerrank
  • 그래프탐색

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 1939] 중량제한 (파라매트릭서치, BFS) (C++)

2022. 2. 20. 00:03
728x90

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

파라매트릭 서치와 BFS를 이용했던 문제로, 특정 무게를 버틸 수 있는 경로가 있는지 확인하는 문제였다.

 

고려해야 할 점은 다음과 같다.

1. 입력값으로 동일한 다리가 들어올 수 있다는 점 (1 2 4 / 1 2 7)

2. 가능한 중량의 최댓값을 골라야 하는데, 중량의 범위가 10억이라는 점

 

따라서, 중량 값을 먼저 정해두고 해당 중량 값을 pass 할 수 있는 경로가 있는지 확인을 하면 된다.

매번 이분 탐색을 진행하면서 해당 값을 버틸 수 있니? 를 물어보는 것이다.

 

중량 값을 먼저 정하는 것에서 이분 탐색을 이용했고, 경로가 있는지 확인하는 것에서 BFS를 이용했다.

추가적으로, 동일한 다리가 들어온다는 점에서 추가적으로 인접 리스트에 정렬을 사용했다.

 

5 8

1 2 4

1 2 7

1 3 5

1 4 4

2 5 4

2 5 7

3 5 1

4 5 4

1 5

의 테스트 케이스를 만들어 봤는데, 정답은 7인데 실제론 4가 나온다.

왜냐하면 BFS로 방문을 할 때, 1에서 2를 갈 때 7이라는 경로가 있지만 4라는 경로를 이용해서 방문을 하는 문제가 있기 때문이다.

그래서 우선적으로 큰 중량의 다리를 건너게 하기 위해서 내림차순으로 정렬을 했다.

 

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

typedef pair<int, int> pii;

int n, m, a, b, c, from, to, e, answer;
vector<pii> v[10001];

bool compare(pii a, pii b) {
	return a.second > b.second;
}

bool BFS(int from, int to, int limit) {
	queue<int> q;
	int check[10001] = { false, };
	q.push(from);

	while (!q.empty()) {
		int x = q.front();
		q.pop();
		if (x == to) {
			return true;
		}

		for (int i = 0; i < v[x].size(); i++) {
			int nx = v[x][i].first;
			int dis = v[x][i].second;

			if (dis >= limit && !check[nx]) {
				check[nx] = true;
				q.push(nx);
			}
		}
	}
	return false;
}

int main() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		cin >> a >> b >> c;
		v[a].push_back({ b,c });
		v[b].push_back({ a,c });
		e = max(e, c);
	}

	for (int i = 0; i < 10001; i++) {
		sort(v[i].begin(), v[i].end(), compare);
	}
	cin >> from >> to;

	int start = 1;
	while (start <= e) {
		int mid = (start + e) / 2;
		if (BFS(from, to, mid)) {
			answer = mid;
			start = mid+1;
		}
		else {
			e = mid-1;
		}
	}
	cout << answer;
}
728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 1374] 강의실 (그리디, 우선순위 큐) (C++)  (0) 2022.04.18
[baekjoon 14888] 연산자 끼워넣기(브루트포스, 백트래킹) (C++)  (0) 2022.02.25
[baekjoon 16926] 배열 돌리기 1 (구현) (C++)  (0) 2022.02.10
[baekjoon 22867] 종점 (스위핑, 문자열, 정렬) (C++)  (0) 2021.10.08
[baekjoon 22860] 폴더 정리(small) (DFS, BFS, 구현, HashMap) (C++)  (0) 2021.10.05
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 1374] 강의실 (그리디, 우선순위 큐) (C++)
    • [baekjoon 14888] 연산자 끼워넣기(브루트포스, 백트래킹) (C++)
    • [baekjoon 16926] 배열 돌리기 1 (구현) (C++)
    • [baekjoon 22867] 종점 (스위핑, 문자열, 정렬) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바