간단한 해설
친구의친구는친구니깝부모의부모는부모이다즉디스조인트셋, union-parent를 사용하자.
N이 최대 10000이라서 union by rank를 안해도 된다.
답
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,k;
int parent[10001];
int findParent(int vertex){
if(parent[vertex]!=vertex) return findParent(parent[vertex]);
return parent[vertex];
}
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
for(int i=1;i<=10000;++i){
parent[i]=i;
}
cin>>n>>m>>k;
vector<int> v(n+1);
for(int i=1;i<=n;++i){
cin>>v[i];
}
int a,b;
for(int i=0;i<m;++i){
cin>>a>>b;
int parentA=findParent(a);
int parentB=findParent(b);
if(parentA!=parentB){
//union but find more cheap chioce
int valA=v[parentA];
int valB=v[parentB];
if(valA>valB){
parent[parentA]=parentB;
}
else parent[parentB]=parentA;
}
}
int ans=0;
for(int i=1;i<=n;++i){
int parentA=findParent(i);
if(i==parentA){
ans+=v[i];
}
}
if(ans>k) cout<<"Oh no";
else cout<<ans;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 23883 알고리즘 수업 - 선택 정렬 3 C++ (0) | 2024.10.22 |
---|---|
백준 16469 소년 점프 C++ (0) | 2024.10.21 |
백준 27978 보물 찾기 2 C++ (0) | 2024.10.10 |
백준 10830 행렬 제곱 C++ (1) | 2024.10.06 |
백준 1956 운동 C++ (0) | 2024.10.06 |