SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제 접근법 :
MST 문제입니다.
크루스칼 알고리즘을 이용해서 풀었고 모든 간선을 만들어서 그비용을 최소로 만드는 문제입니다.
어렵지 않은 문제인데 문제조건에 정수만 나올수 있도록 소수점 안나오게 반올림 잘하셔야하구
형변환 잘하셔야 합니다. 몇번 틀려서 PYTHON이 거의 무한대의 범위를 제공할까 싶어서 똑같이했는데도
안되서 C++로 까다롭게 형변환만 잘맞추더니 답이맞더군요
소스코드 :
#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll>x,y;
vector<tuple<ll,ll,ll>>v;
vector<int> parent;
int n;
double e;
void input(){
cin>>n;
x=y=vector<ll>(n);
for(int i=0;i<n;i++)cin>>x[i];
for(int i=0;i<n;i++)cin>>y[i];
cin>>e;
}
int find(int idx){
if(idx==parent[idx])return idx;
return parent[idx]=find(parent[idx]);
}
bool merge(int a,int b){
a =find(a);
b =find(b);
if(a==b)return false;
parent[b]=a;
return true;
}
void solve(){
v.clear();
parent = vector<int>(n);
for(int i=0;i<n;i++)parent[i]=i;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
v.push_back({(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]),i,j});
}
}
sort(v.begin(),v.end());
double sum=0;
for(auto[cost,node1,node2]:v){
if(merge(node1,node2))
sum+=cost;
}
cout<<(ll)round(sum*e)<<"\n";
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("input.txt","r",stdin);
int test;
cin>>test;
for(int i=1;i<=test;i++){
cout<<"#"<<i<<" ";
input();
solve();
}
}
'SWEA' 카테고리의 다른 글
[SWEA]1260. [S/W 문제해결 응용] 7일차 - 화학물질2 [Java] (0) | 2024.12.10 |
---|---|
[SWEA] 1258. [S/W 문제해결 응용] 7일차 - 행렬찾기 (JAVA) (0) | 2024.12.10 |
[SWEA] 1248. [S/W 문제해결 응용] 3일차 - 공통조상 (C++) (0) | 2024.12.09 |
[SWEA] 1252. 단순도금비용 (python) (0) | 2024.12.09 |
[SWEA] 11387. 몬스터 사냥 (1) | 2021.08.14 |