No Rules Rules

유럽여행 (feat. 백준, 1185번) 본문

생활/코테

유럽여행 (feat. 백준, 1185번)

개발하는 완두콩 2023. 3. 10. 16:55
728x90
반응형

유럽여행
https://www.acmicpc.net/problem/1185

 

1185번: 유럽여행

첫 줄에는 방문할 나라의 수 N(5 ≤ N ≤ 10,000)과 이 나라들 사이를 연결하는 길의 수 P(N-1 ≤ P ≤ 100,000)가 주어진다. 두 번째 줄에는 N+1번째 줄까지 i+1번째 줄에는 i번째 나라를 방문할 때 드는 비

www.acmicpc.net

 

// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
short N, COST[10001];
int P;
vector<pair<short, int>> arr[10001];      // 다음 나라, 왕복 비용
bool visit[10001]{false};
priority_queue<pair<int, short>, vector<pair<int, short>>, greater<pair<int, short>>> q;      // 왕복 비용, 다음 나라
int main(){
    ios::sync_with_stdio(false), cin.tie(NULL);
    cin >> N >> P;
    for(short n = 1; n <= N; ++n)
        cin >> COST[n];
    for(int p = 0; p < P; ++p){
        short S, E, L;
        cin >> S >> E >> L;
        arr[S].push_back(make_pair(E, COST[S] + COST[E] + 2 * L)), arr[E].push_back(make_pair(S, COST[E] + COST[S] + 2 * L));
    }
    short next, nnext;
    int cost, ans = *min_element(COST + 1, COST + N + 1);
    short min_value_pos = static_cast<short>(min_element(COST + 1, COST + N + 1) - COST);
    q.push(make_pair(0, min_value_pos));
    while(!q.empty()){
        cost = q.top().first, next = q.top().second; q.pop();
        if(visit[next])
            continue;
        visit[next] = true;
        ans += cost;
        for(auto& v : arr[next]){
            nnext = v.first, cost = v.second;
            if(!visit[nnext])
                q.push(make_pair(cost, nnext));
        }
    }
    cout << ans;
	return 0;
}
// *&)*@*

 

반응형

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

단순히 최단거리만을 구해선 안되고, 나라와 나라간 모든 비용을 미리 산술한 뒤에 가장 저렴한 나라에서 출발한다는 정의를 두고 풀이하였습니다.

저는 프림 알고리즘을 사용하여 풀이하였습니다.

728x90
반응형

'생활 > 코테' 카테고리의 다른 글

분수 합 (feat. 백준, 1735번)  (0) 2023.03.14
찬반투표 (feat. 백준, 27736번)  (0) 2023.03.14
정복자 (feat. 백준, 14950번)  (0) 2023.03.10
전기가 부족해 (feat. 백준, 10423번)  (0) 2023.03.10
빙고 (feat. 백준, 2578번)  (0) 2023.03.08
Comments