문제
https://www.acmicpc.net/problem/1939
설명
다익
파라메트릭 + bfs로 가능
그그그그 주어진 mid 값 가능한 최대 물건의 무게가 가능하냐 ? bfs(mid)
그렇다면 무게를 증가 시키자 s = mid + 1 , 아니라면 감소시키자 e = mid - 1
주의
bfs(mid)가 true라면 가능한 값인데 다음에 다시 if(bfs(mid)) 가 무조건 걸린다는 확신이 없기에 여기에서 가능하다면 정답 값 ans에 mid값을 갱신을 해주어야한다.
매우 매우 잘못된 구간이 있었는데 그것은 반대로 생각한 것이다 mid값은 가능한 물건의 값인데 다리 무게로 코드 치다가 생각을 안해서 반대로 짰다 ㅠㅠㅠㅠ
그리고 bfs를 돌릴 때 쭉 돌리다가 마지막에 visitid[End]를 검사해서 도착여부를 보고 return을 해주어야한다.
소스
#include <bits/stdc++.h>
using namespace std;
int n, m, start, End;
// 4 * 4 => 14
vector<pair<int, int>> Info[10001];
/*
vector가 10001개가 있다
Info[now]를 하면 나온 것이 벡터이다
*/
bool bfs(int &x) {
int flagCost = x; // 해당 비용으로 가능한가 ?
bool visited[10001] = { false, };
queue<int> q;
q.push(start);
visited[start] = 1;
while (!q.empty())
{
int now = q.front(); q.pop();
for (int i = 0; i < Info[now].size(); i++) {
if (visited[Info[now][i].first]) continue;
int next = Info[now][i].first;
int cost = Info[now][i].second; // cost 다리가 버틸 수 있는 중량
if (flagCost <= cost) { // 가능한 물건 무게 < 다리 무게
q.push(next);
visited[next] = 1;
}
}
}
if (visited[End]) return true;
else return false;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a = 0, b = 0, c = 0;; cin >> a >> b >> c;
Info[a].push_back({ b, c });
Info[b].push_back({ a, c });
}
cin >> start >> End;
int s = 1, e = 1e9; // 범위 1 ~ 10억
int mid = 0;
int ans = 0;
while (s <= e)
{
mid = s + e >> 1;
if (bfs(mid)) {
s = mid + 1;
ans = mid;
}
else {
e = mid - 1;
}
}
cout << ans;
return 0;
}
'알고리즘' 카테고리의 다른 글
네트워크 복구 백준 2211 (c++) (0) | 2021.12.16 |
---|---|
길 찾기 게임 (c++) (0) | 2021.12.15 |
문자열압축_두가지버전(시뮬) (0) | 2021.12.10 |
1차원 격자(시뮬레이션, 비공풀이) (0) | 2021.12.08 |
백준 가운데를 말해요 1655 (c++) (0) | 2021.12.07 |