티스토리 뷰

반응형

https://www.acmicpc.net/problem/1368

 

1368번: 물대기

첫 줄에는 논의 수 N(1 ≤ N ≤ 300)이 주어진다. 다음 N개의 줄에는 i번째 논에 우물을 팔 때 드는 비용 Wi(1 ≤ Wi ≤ 100,000)가 순서대로 들어온다. 다음 N개의 줄에 대해서는 각 줄에 N개의 수가 들어

www.acmicpc.net

 

 

  • 필요한 배경지식

최소 신장 트리 : Minimum Spanning Tree - 크루스칼(Kruskal) 알고리즘

 

 

 

  • 문제 해결 방법

MST를 활용하여 풀어낼 수 있는 문제입니다.

i번째 논과 j번째 논을 연결하는데 드는 비용 Pi,j를 그래프의 간선으로 표현하면, 문제의 조건에서 Pi,j = Pj,i 라는 것을  확인할 수 있으므로 N개의 논은 무방향 그래프로 나타낼 수 있습니다.

 

그렇다면 출력해야 할 값은 모든 노드를 연결하는데 필요한 최소비용을 의미하므로 최소 스패닝 트리를 이용하여 답을 구할 수 있습니다.

 

주의해야 할 부분은 처음에 물을 대려면 우물을 파야 하는데 이때 각 논마다 우물을 파는 비용이 따로 존재하기 때문에 이 비용을 최소비용에 고려해주어야 한다는 것입니다.

복잡하게 생각할 필요없이 우물을 하나의 다른 노드로 인식하면 문제를 쉽게 해결할 수 있습니다.

 

우물을 0번 노드라고 하면, 문제에서의 <예제 입력1>의 최소 스패닝 트리는 아래와 같습니다.

 

예제입력1의 최소 스패닝 트리

 

 

 

 

  • C++ 전체 코드
#include<bits/stdc++.h> using namespace std; using tpi = tuple<int,int,int>; int N,M; int parent[301]{}; vector<tpi> edge; // Union-Find int find(int k) { ​​​​if (k == parent[k]) return k; ​​​​else return parent[k] = find(parent[k]); } void merge(int a, int b) { ​​​​a = find(a); ​​​​b = find(b); ​​​​parent[a] = b; } int main() { ​​​​ios_base::sync_with_stdio(0); ​​​​cin.tie(0); ​​​​cin>>N; ​​​​int t; ​​​​for(int i=1; i<=N; i++) { ​​​​​​​​cin>>t; ​​​​​​​​edge.push_back({t,0,i}); // 우물과 [1,N]노드들과 연결된 간선 ​​​​​​​​parent[i] = i; ​​​​} ​​​​for(int i=1; i<=N; i++){ ​​​​​​​​for(int j=1; j<=N; j++){ ​​​​​​​​​​​​cin>>t; ​​​​​​​​​​​​if(i<j) edge.push_back({t,i,j}); // Pi,j == Pj,i 이므로 ​​​​​​​​} ​​​​} ​​​​sort(edge.begin(), edge.end()); ​​​​int ans = 0; ​​​​// 크루스칼 ​​​​for(auto v : edge){ ​​​​​​​​int w,a,b; ​​​​​​​​tie(w,a,b) = v; ​​​​​​​​if(find(a)==find(b)) continue; ​​​​​​​​merge(a,b); ​​​​​​​​ans += w; ​​​​} ​​​​cout<<ans; }

 

반응형

'알고리즘 공부 > 문제풀이' 카테고리의 다른 글

백준 17780번 - 새로운 게임  (0) 2021.05.24
백준 10159번 - 저울  (0) 2021.05.23
백준 2512번 - 예산  (0) 2021.05.21
백준 10775번 - 공항  (0) 2021.05.21
백준 16345번 - 인구 이동  (0) 2021.05.20
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함