크러스컬 알고리즘 구현 1 (붕괴법칙을 적용하지 않은 방법)

프로그램 개요 : C 언어를 사용한 크러스컬 알고리즘(Kruskal Algorithm) 구현. 붕괴법칙을 적용하지 않은 크러스컬 알고리즘. 붕괴법칙을 적용한 크러스컬 알고리즘 크러스컬 알고리즘에 대한 설명은 아래 링크의 이전 글에서 볼 수 있습니다. 2020.07.02 - [알고리즘] - 크러스컬(Kruskal) 알고리즘 이 글에서는 예로 주어진 그래프에 대해서 크러스컬 알고리즘으로 문제를 해결하는 방법과 코드를 작성하였습니다. 입력 가중치 그래프 : 입력 파일 : 입력 데이터 입력 데이터가 들어있는 .txt 파일입니다. [graphInf.txt 0.00MB](https://blog.kakaocdn.net/dna/9GWpl/btq2iFfdTGn/AAAAAAAAAAAAAAAAAAAAAPR1afPSYRSSngG_pTeKxCHZPt50vsapwyoi0hUqhYlq/graphInf.txt?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1788188399&allow_ip=&allow_referer=&signature=tBqiAllXzExVIgPQgq2UUYjZeLk%3D&attach=1&knm=tfile.txt) 프로그램 실행 결과 : ...

2021년 4월 9일 · 9 분 · Sobamemil

크러스컬(Kruskal) 알고리즘

크러스컬(Kruskal) 알고리즘이란? 크러스컬 알고리즘은 최소 비용 신장 그래프를 찾는 알고리즘 입니다. 변의 개수를 E, 꼭지점의 개수를 V라고 한다면 크러스컬 알고리즘은 O(ElogV)의 시간 복잡도를 갖습니다. 크러스컬의 MST(욕심쟁이 방법) 알고리즘 간략 코드 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 edge_set kruskal_MST(edge_set E, int n) { sort(E); // 간선 정렬 edge_set MST_E = { }; for (i=0; i<n; i++) init_set(i); // n개의 집합(트리)을 생성 while(MST_E의 간선 수 < n - 1) { (u, v) = E의 최소 가중치 간선; E = E - {(u, v)}; if(find(u) != find(v)) // u와 v가 다른 집합(트리) 원소 { MST_E = MST_E ∪ {(u, v)}; // 간선 추가 union(u, v); // 두 집합(트리)을 합병 } } return MST_E; } - 예제 - ...

2020년 7월 2일 · 2 분 · Sobamemil

이원 탐색 트리(Binary Search Tree) 배열 만들기

문제 : 배열을 이용하여 이원 탐색 트리를 만들고 탐색하는 프로그램을 작성하라. 입력 : 정렬이 되지 않은 숫자들 프로그램 : 2.1 입력된 숫자들을 하나씩 읽으면서 이원 탐색 트리 배열 만들기 2.2 숫자 하나를 입력하면 이원탐색트리 알고리즘을 적용하여 해당하는 배열의 첨자를 출력하기 (이 때 출력은 배열 원소들을 차례대로 출력하고 해당하는 배열 첨자를 출력) 실행 결과 : 코드 : 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #include using namespace std; void newBinarySearchTree(int *num_arr, int size, int *new_num_arr) { for(int i=0; i<size+20; i++){ // 이원탐색트리 배열 -1로 초기화 new_num_arr[i] = -1; } new_num_arr[0] = num_arr[0]; for(int i=1; i<size; i++){ int index=0; // 새로 들어올 숫자가 이원탐색트리 배열의 루트보다 작으면 왼쪽으로 이동 if(new_num_arr[0] > num_arr[i]) { for(int j=2*index+1;;) { if(new_num_arr[j] != -1){ //삽입하려는 이원탐색트리 배열공간이 NULL이 아니면 비교 if(new_num_arr[j] < num_arr[i]) j=2*j+2; // 삽입하고자 하는 숫자가 더 크면 2j+2 else if(new_num_arr[j] > num_arr[i]) j=2*j+1; // 삽입하고자 하는 숫자가 더 작으면 2j+1 z else { //같은 숫자가 나오면 오류메시지 출력 후 프로그램 비정상 종료 cout << "same data error...\n"; exit(1); } } else if(new_num_arr[j] == -1) { // 삽입하려는 이원탐색트리 배열 공간이 NULL이면 바로 삽입 new_num_arr[j] = num_arr[i]; break; } } } // 새로 들어올 숫자가 이원탐색트리 배열의 루트보다 크면 오른쪽으로 이동 else if(new_num_arr[0] < num_arr[i]) { for(int j=2*index+2;;) { if(new_num_arr[j] != -1){ // 삽입하려는 이원탐색트리 배열공간이 NULL이 아니면 비교 if(new_num_arr[j] < num_arr[i]) j=2*j+2; else if(new_num_arr[j] > num_arr[i]) j=2*j+1; else { cout << "same data error...\n"; exit(1); } } else if(new_num_arr[j] == -1) { new_num_arr[j] = num_arr[i]; break; } } } else continue; } } void find(int *new_num_arr, int size) { int x, flag; cout << "찾고자 하는 숫자 입력 : "; cin >> x; for(int i=0; i<size; i++) // 이원탐색트리 배열의 모든 원소 출력 cout << "arr[" << i << "] : " << new_num_arr[i] << endl; for(int i=0; i<size; i++){ if(new_num_arr[i] == x) { cout << "index : " << i; flag = true; break; } else flag = false; } if(!flag) // flag가 false이면 찾고자 하는 숫자가 없다고 출력 cout << "찾고자 하는 숫자 없음\n"; } int main() { int num_arr[] = {50, 40, 55, 30, 45, 54, 53, 1, 60, 301, 2}; int num_arr_size = sizeof(num_arr)/sizeof(num_arr[0]); int *new_num_arr = new int [num_arr_size + 20]; // 이원탐색트리 배열 공간 생성 newBinarySearchTree(num_arr, num_arr_size, new_num_arr); find(new_num_arr, num_arr_size + 20); } 설명 : ...

2020년 3월 19일 · 3 분 · Sobamemil