Skip to main content
  1. Posts/
  2. Algorithm/

BOJ 1647 도시 분할 계획

·152 words·1 min
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 집 (정점)과 길 (간선)이 있다.
    • 마을 두개로 분리해야한다.
      • 이 때, 간선의 가중치의 합을 최소화해야한다.
  • 이미 두 집이 한 마을 안에 있다면, 둘이 연결할 필요가 없다.
    • 이미 다른 우회로로 갈 수 있기 때문
  • 연결하던 도중 마을이 두개가 남았다면 끝내면 된다.
    • 크루스칼 알고리즘으로 덩어리가 두개가 남을때까지 반복하면 되겠다.

💻 풀이
#

  • 코드 (C++):
void solve(){
    int N, M; cin >> N >> M;
    vector<tuple<int, int, int>> edges; // weight, u, v
    rep(i, 0, M){
        int u, v, w; cin >> u >> v >> w;
        edges.emplace_back(w, u, v);
    }
    UF.init(N+1);
    sort(all(edges));
    int ans = 0;
    for(auto &[w, u, v]: edges){
        if(UF.group == 3) break;
        if(UF.merge(u, v)) ans += w;
    }
    cout << ans << "\n";
}
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다