계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

  • 홈
  • Who Am I(CV)
  • 태그

공지사항

인기 글

태그

  • DIP
  • 네트워크플로우
  • 파이썬 클린코드
  • 비용함수
  • machinelearning
  • 선형회귀
  • SIFT
  • 손실함수
  • NLP
  • 머신러닝
  • ML
  • 결정경계
  • 에지검출
  • 지도학습
  • 최대유량
  • 디지털이미지처리
  • f1-score
  • 알고리즘
  • ComputerVision
  • DigitalImageProcessing
  • 패턴인식
  • LM
  • 기계학습
  • 비지도학습
  • 컴퓨터비전
  • 언어모델
  • 경사하강법
  • MaximumFlow
  • 군집화
  • networkflow

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

[C++] BOJ 4386. 별자리 만들기
Algorithm/백준 문제풀이

[C++] BOJ 4386. 별자리 만들기

2020. 9. 23. 18:25
반응형

www.acmicpc.net/problem/4386

 

4386번: 별자리 만들기

도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일�

www.acmicpc.net

 

크루스칼 알고리즘 이론 참고

codingsmu.tistory.com/11?category=871718

 

[Algorithm: 알고리즘] 05 Greedy Algorithm

목차 0. Basics: 그리디 알고리즘 기초 1. Minimum Spanning Trees : 최소 신장 트리 - 신장 트리 - 최소 비용 신장 트리 - Kruskal's Algorithm( Original ver.) : 크루스칼 알고리즘 - Kruskal's Algorithm( Im..

codingsmu.tistory.com

전체 코드는 깃허브에

#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>

using namespace std;

int n;
vector<pair<double, double>> star;
vector<vector<double>> edge;
int *parent;

double calc_dist(int i,int j);
bool compare(vector<double> a, vector<double> b);
int find(int i);
void Union(int x, int y);
bool isCycle(int src, int dest);

int main(void){
    double x,y,d;
    int edge_n = 0;
    int cnt = 0;
    double ans = 0.0;
    cin >> n;
    parent = new int[n];
    // 노드 저장
    for(int i = 0; i < n; i++){
        scanf("%lf %lf", &x, &y);
        star.push_back(make_pair(x,y));
    }
    // 노드들의 가중치 저장
    for(int i = 0; i < n; i++){
        for(int j = i+1; j < n; j++){
            d = calc_dist(i,j);
            edge.push_back(vector<double>());
            edge[edge_n].push_back(i);
            edge[edge_n].push_back(j);
            edge[edge_n++].push_back(d);
        }
    }
    // 조상 노드 초기화
    for(int i = 0; i < n; i++)
        parent[i] = -1;
    //엣지 가중치 오름차순 정렬
    sort(edge.begin(), edge.end(),compare);
    // 크루스칼 알고리즘
    for(int i = 0; i < edge.size(); i++){
        if( !isCycle( (int)edge[i][0], (int)edge[i][1] ) ){
            ans += edge[i][2];
            cnt++;
            if( cnt == n - 1)
                break;
        }
    }
    printf("%.2f", ans);
    return 0;
}
double calc_dist(int i, int j){
    return sqrt(pow((star[i].first - star[j].first), 2)
                + pow((star[i].second - star[j].second), 2));
}
bool compare(vector<double> a, vector<double> b){
    // v[0] = i, v[1] = j, v[2] = dist
    return a[2] < b[2];
}
int find(int i){
    if( parent[i] == -1 )
        return i;
    return find(parent[i]);
    
}
void Union(int x, int y){
    int xset = find(x);
    int yset = find(y);
    if( xset != yset )
        parent[xset] = yset;
}
bool isCycle(int src, int dest){
    int x = find(src);
    int y = find(dest);
    if ( x == y )//is Cycle
        return true;
    // isn't Cycle
    Union(x,y);
    return false;
}
반응형

'Algorithm > 백준 문제풀이' 카테고리의 다른 글

[Python] BOJ 9663. N-Queen  (1) 2022.03.20
[Python] BOJ 1300. k번째 수  (0) 2021.01.31
[C++] BOJ 1051. 숫자 정사각형  (0) 2020.09.30
[C++] BOJ 7576. 토마토  (0) 2020.09.16
[Kotlin] BOJ 7785. 회사에 있는 사람  (0) 2020.01.07
    'Algorithm/백준 문제풀이' 카테고리의 다른 글
    • [Python] BOJ 1300. k번째 수
    • [C++] BOJ 1051. 숫자 정사각형
    • [C++] BOJ 7576. 토마토
    • [Kotlin] BOJ 7785. 회사에 있는 사람
    계속지나가기
    계속지나가기
    NLP Engineer

    티스토리툴바