No Rules Rules

슬슬 가지를 먹지 않으면 죽는다 (feat. 백준, 27945번) 본문

생활/코테

슬슬 가지를 먹지 않으면 죽는다 (feat. 백준, 27945번)

개발하는 완두콩 2023. 5. 18. 12:18
728x90
반응형

슬슬 가지를 먹지 않으면 죽는다
https://www.acmicpc.net/problem/27945

 

27945번: 슬슬 가지를 먹지 않으면 죽는다

첫째 줄에 요리 학원의 수 $N$, 길의 수 $M$이 주어진다. $(2\le N\le 10^5;$ $N-1\le M\le\min\left(5\times 10^5, {N\choose 2}\right))$ 둘째 줄부터 $M$개 줄에 각 길이 연결하는 두 학원의 번호 $u_i$, $v_i$, 길에 있는 노

www.acmicpc.net

 

// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
bool visit[100001]{false};
vector<int> check;
vector<pair<int, int>> arr[100001];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
int main(){
	ios::sync_with_stdio(false), cin.tie(NULL);
    register int N, M;
    cin >> N >> M;
    for(register int m = 0, a, b, c; m < M; ++m){
        cin >> a >> b >> c;
        arr[a].push_back(make_pair(b, c)), arr[b].push_back(make_pair(a, c));
    }
    q.push(make_pair(0, 1));
    while(!q.empty()){
        auto next = q.top().second, cost = q.top().first, nnext = 0; q.pop();
        if(visit[next])
            continue;
        visit[next] = true;
        check.push_back(cost);
        for(auto& v : arr[next]){
            nnext = v.first, cost = v.second;
            if(!visit[nnext])
                q.push(make_pair(cost, nnext));
        }
    }
    sort(check.begin(), check.end());
    auto ans = 0;
    for(auto& v : check){
        if(ans == v)
            ++ans;
        else
            break;
    }
    cout << ans;
    return 0;
}
// *&)*@*

 

반응형

최소 스패닝 트리를 구하는 문제입니다.

저는 프림 알고리즘을 활용하였습니다.

MST를 만족하는 모든 d일차를 저장하고, 연속되지 않는 일차가 바로 키위새가 쓰러지는 날입니다.

728x90
반응형
Comments