새소식

코딩테스트/백준_골드

[C++][백준 1939] 중량제한

  • -

[문제]

1939번: 중량제한 (acmicpc.net)

 

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를 이용한 문제.

* 나중에 다시 풀어보자. 파라메트릭 서치에 다른 알고리즘을 추가하니까 생각보다 구현단계에서 많이 막혔다.

10억과 1을 이용해서 binary search를 해서 몇이 나올 수 있는지 파악하는 문제.

파라메트릭 서치를 5문제 더 풀어보고 다시 풀어보자!

[코드]

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

using namespace std;

int visited[100001];
int n,m;

vector<pair<int, int> > island[100001];

//파라메트릭 서치 + bfs
bool bfs(int sPosition, int ePosition, int mid){

    queue<int> truck;

    for(int i = 0;i<100001;i++){
        visited[i] = false;
    }

    truck.push(sPosition);
    visited[sPosition] = 1;

    while(truck.size() > 0){
        int curL = truck.front();
        truck.pop();

        if(curL == ePosition){
            return true;
        }

        for(int i = 0;i<island[curL].size();i++){
            int next = island[curL][i].first;
            int cost = island[curL][i].second;
            if(visited[next] == 0){
                if(mid <= cost){
                    visited[next] = 1;
                    truck.push(next);
                }
            }
        }
    }

    return false;
}

void parametric(int sPosition, int ePosition){
    int start = 1;
    int end = 1000000000;
    int mid;
    int result = 0;

    while(start <= end){
        mid = (start + end) / 2;
        if(bfs(sPosition,ePosition,mid) == true){
            start = mid + 1;
        }
        else{
            end = mid - 1;
        }
    }

    cout<<end<<endl;

    return;
}

int main() {
    cin>>n>>m;

    for(int i = 0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        island[a].push_back(make_pair(b,c));
        island[b].push_back(make_pair(a,c));
    }

    int sPosition,ePosition;
    cin>>sPosition>>ePosition;

    parametric(sPosition,ePosition);

    return 0;
}

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.