문제
N(2≤N≤10,000)개의 섬으로 이루어진 나라가 있다. 이들 중 몇 개의 섬 사이에는 다리가 설치되어 있어서 차들이 다닐 수 있다.
영식 중공업에서는 두 개의 섬에 공장을 세워 두고 물품을 생산하는 일을 하고 있다. 물품을 생산하다 보면 공장에서 다른 공장으로 생산 중이던 물품을 수송해야 할 일이 생기곤 한다. 그런데 각각의 다리마다 중량제한이 있기 때문에 무턱대고 물품을 옮길 순 없다. 만약 중량제한을 초과하는 양의 물품이 다리를 지나게 되면 다리가 무너지게 된다.
한 번의 이동에서 옮길 수 있는 물품들의 중량의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N, M(1≤M≤100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1≤A, B≤N), C(1≤C≤1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리가 존재한다는 의미이다. 서로 같은 두 도시 사이에 여러 개의 다리가 있을 수도 있으며, 모든 다리는 양방향이다. 마지막 줄에는 공장이 위치해 있는 섬의 번호를 나타내는 서로 다른 두 정수가 주어진다. 공장이 있는 두 섬을 연결하는 경로는 항상 존재하는 데이터만 입력으로 주어진다.
출력
첫째 줄에 답을 출력한다.
예제 입력 1 복사
3 3 1 2 2 3 1 3 2 3 2 1 3
예제 출력 1 복사
3
bfs와 이분 탐색을 합한 문제이다.
이분 탐색을 통해 가능한 중량을 추정한 후 해당하는 중량으로 start 공장부터 dest 공장까지 도달할 수 있는지를 판단한다. 만약 가능하다면 더 큰 무게로도 가능하다는 뜻이므로 lo를 mid+1로 하고, 반대의 경우 hi를 mid-1로 한다.
bfs에서는 start부터 연결된 지점을 방문하면서 mid 중량보다 적은 무게를 견디는 다리는 건너지 않는다. dest 공장까지 무사히 도착한다면 가능하다는 뜻의 1을 반환하고 아닌 경우 0을 반환해서 mid 중량을 조절한다.
chosh95/STUDY
프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.
github.com
C++ 코드
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
vector<pair<int,int>> bridge[10001];
int N, M;
int start, dest;
int maxW, res;
int visit[10001];
int bfs(int mid) {
queue<int> q;
q.push(start);
visit[start] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur == dest) return 1;
for (int i = 0; i < bridge[cur].size(); i++) {
int next = bridge[cur][i].first;
int nextW = bridge[cur][i].second;
if (visit[next] == 1 || nextW < mid) continue;
visit[next] = 1;
q.push(next);
}
}
return 0;
}
void binary() {
int hi = maxW, lo = 0;
while (lo <= hi) {
int mid = (lo + hi) / 2;
memset(visit, 0, sizeof(visit));
if (bfs(mid) == 1)
lo = mid + 1;
else
hi = mid - 1;
}
cout << hi;
}
int main()
{
cin >> N >> M;
for (int a, b, c, i = 0; i < M; i++) {
cin >> a >> b >> c;
bridge[a].push_back({ b,c });
bridge[b].push_back({ a,c });
maxW = max(maxW, c);
}
cin >> start >> dest;
binary();
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 앱 (7579번) (0) | 2020.06.22 |
---|---|
[백준] 효율적인 해킹(1325번) (0) | 2020.06.18 |
[백준] 양 (3184번) (0) | 2020.06.16 |
[백준] 성곽 (2234번) (0) | 2020.06.12 |
[백준] 절댓값 힙(11286번) (0) | 2020.06.11 |