No Rules Rules

도시 분할 계획 (feat. 백준, 1647번) 본문

생활/코테

도시 분할 계획 (feat. 백준, 1647번)

개발하는 완두콩 2023. 3. 2. 14:04
728x90
반응형

도시 분할 계획
https://www.acmicpc.net/problem/1647

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번

www.acmicpc.net

 

// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
bool visit[100001];
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;
    memset(visit, false, N);
    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));
    register int next, nnext, cost, max_value = 0, total = 0;
    while(!q.empty()){
        next = q.top().second, cost = q.top().first; q.pop();
        if(visit[next])
            continue;
        visit[next] = true;
        total += cost;
        if(cost > max_value)
            max_value = cost;
        for(auto& v : arr[next]){
            nnext = v.first;
            if(visit[nnext])
                continue;
            cost = v.second;
            q.push(make_pair(cost, nnext));
        }
    }
    cout << total - max_value;
	return 0;
}
// *&)*@*

 

반응형

문제 자체가 이해가 안가서 한참 고민했습니다.

결국 N-1개의 집이 있는 마을과 1개의 집이 있는 마을로 기준을 잡고 하나의 길을 없앴을때의 최소 유지비를 구하는 문제입니다.

따라서 전체 유지비에서 최대 유지비를 빼면 정답이 되겠습니다.

728x90
반응형
Comments