박오이님
무미건조한 개발자
박오이님
전체 방문자
오늘
어제
  • 뭥미 (101)
    • 프로젝트 (8)
      • 자가 보호 (3)
      • 주식 시장 분석 도구 (5)
    • 보안 (7)
      • 개론 (2)
      • 웹 (2)
      • 시스템 (2)
    • 개발 (69)
      • C++ (12)
      • Win32 (7)
      • MFC (2)
      • 자료구조 (8)
      • 알고리즘 (22)
      • 백준 (9)
      • 프로그래머스 (4)
      • LeetCode (0)
      • 개발자 면접 준비 (4)
      • OpenGL (1)
    • 서적 (13)
      • Effective C++ (9)
      • Effective Modern C++ (4)
    • 관심사 (4)
      • 재테크 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • C++
  • std
  • 시스템프로그래밍
  • 코딩컨벤션
  • 윈도우시스템프로그래밍
  • 에라토스테네스의 체 #알고리즘 #개발 #C #C++ #소수 #소수판별
  • 플로이드와샬알고리즘 #최단경로 #백준 #알고리즘 #개발 #C #C++
  • 나동빈 #알고리즘 #동빈나
  • 동빈나
  • DFS #BFS #알고리즘 #프로그래밍 #코딩테스트 #코딩 #C++ #C
  • 윈도우
  • 윈도우프로그래밍
  • EffectiveC++
  • CPP
  • 합집합찾기
  • 윈도우개발자
  • 백준 #알고리즘 #플로이드와샬 #DFS #BFS #C #C++
  • 최소간선비용
  • 나동빈
  • 안경잡이개발자
  • 크루스칼알고리즘
  • C
  • JSON
  • 프로세스메모리
  • 에라토스테네스의 체 #C #C++ #개발 #알고리즘 #BFS #DFS #백준 #백준알고리즘
  • jsoncpp
  • Functional
  • 알고리즘
  • vcpkg
  • 개발

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
박오이님

무미건조한 개발자

개발/알고리즘

크루스칼 알고리즘 (Kruskal Algorithm)

2019. 7. 3. 22:00

가장 적은 비용으로 모든 노드를 연결하기 위해 사용하는 알고리즘

 

최소 비용 신장 트리

 

Idea. 간선을 거리가 짧은 순서대로 그래프에 포함시키면 어떨까?

 

간선 정보를 오름차순으로 정렬한 뒤에 비용이 적은 간선부터 차근차근 그래프에 포함

 

유의사항. 사이클이 형성되면 안된다.

--> 사이클이 발생하는지의 여부는 Union-Find알고리즘을 사용

순서.

1. 정렬된 순서에 맞게 그래프에 포함시킵니다.

2. 포함시키기 전 사이클 테이블을 확인.

3. 사이클을 형성하는 경우 간선을 포함하지 않습니다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int getParent(int parent[], int x)
{
	if (parent[x] == x) return x;

	return parent[x] = getParent(parent, parent[x]);
}

// 두 부모 노드를 합치는 함수
void unionParent(int parent[], int a, int b)
{
	a = getParent(parent, a);
	b = getParent(parent, b);

	if (a < b)
	{
		parent[b] = a;
	}
	else
	{
		parent[a] = b;
	}

}

int findParent(int parent[], int a, int b)
{
	a = getParent(parent, a);
	b = getParent(parent, b);

	if (a == b)
	{
		return 1;
	}

	return 0;
}

// 간선 클래스 선언
class Edge {

public:
	int node[2];
	int distance;
	Edge(int a, int b, int distance) 
	{
		this->node[0] = a;
		this->node[1] = b;
		this->distance = distance;
	}

	bool operator < (Edge& edge)
	{
		return this->distance < edge.distance;
	}
};
int main(void)
{
	int n = 7;
	int m = 11;

	vector<Edge> v;

	v.push_back(Edge(1, 7, 12));
	v.push_back(Edge(1, 4, 28));
	v.push_back(Edge(1, 2, 67));
	v.push_back(Edge(1, 5, 17));

	v.push_back(Edge(2, 4, 24));
	v.push_back(Edge(2, 5, 62));

	v.push_back(Edge(3, 5, 20));
	v.push_back(Edge(3, 6, 37));

	v.push_back(Edge(4, 7, 13));

	v.push_back(Edge(5, 6, 45));
	v.push_back(Edge(5, 7, 73));

	sort(v.begin(), v.end());

	int parent[7];
	for (int i = 0; i < n; i++)
	{
		parent[i] = i;
	}

	int sum = 0;
	for (int i = 0; i < v.size(); i++)
	{
		if (!findParent(parent, v[i].node[0] - 1, v[i].node[1] - 1))
		{
			sum += v[i].distance;
			unionParent(parent, v[i].node[0] - 1, v[i].node[1] - 1);
		}
	}

	printf("%d\n", sum);

}

 

'개발 > 알고리즘' 카테고리의 다른 글

에라토스테네스의 체  (0) 2019.09.01
다이나믹 프로그래밍(Dynamic Programming)  (0) 2019.07.04
Union-Find(합집합 찾기)  (0) 2019.07.03
깊이 우선 탐색(Depth First Search, DFS)  (0) 2019.06.27
너비 우선 탐색(Breadth First Search, BFS)  (0) 2019.06.25
    '개발/알고리즘' 카테고리의 다른 글
    • 에라토스테네스의 체
    • 다이나믹 프로그래밍(Dynamic Programming)
    • Union-Find(합집합 찾기)
    • 깊이 우선 탐색(Depth First Search, DFS)
    박오이님
    박오이님
    긍정도 아니고 부정도 아닌 0

    티스토리툴바