입력: 7 9 0 1 29 5 4 27 6 4 25 4 3 22 6 3 18 1 2 16 1 6 15 2 3 12 0 5 10 = 테스트용 Main함수 = int main() { Edge* e = readGraph(); // 그래프의 모든 에지를 e배열에 저장 HeapType_ptr h = heap_init(e); // 힙 자료구조에 에지 배열 원소를 순차 대입 MyHeapify(h); // 힙 성질 맞추기 // 힙에서 삭제하면서 정렬 int i; for (i = 0; i < m; i++) e[i] = myDeleteMin(h); ufp u = uf_init(n); // 유니온 파인드 집합 생성 int vroot, wroot, sum, selected_edge; // 각 집합의 루트, 가중치 합계, 연결한 에지의 수 selected_edge = sum = 0; // 연결한 에지의 수가 n-1이 되면 스패닝 트리 완성 -> 반복문 빠져 나옴 for (i = 0; selected_edge < (n - 1); i++) { vroot = myFind(u, e[i].v); wroot = myFind(u, e[i].w); printf("정점v:%d, v트리의 Root:%d, 정점w:%d, w트리의 Root:%d, e(v,w)의 가중치:%d, ", e[i].v, vroot, e[i].w, wroot, e[i].x); // find를 해서 같은 root가 나오면 이미 같은 집합 -> 연결하면 사이클이 생성됨 if (vroot != wroot) { myUnion(u, vroot, wroot); selected_edge++; sum += e[i].x; } printf("선택된 에지의 수:%d", selected_edge); if (vroot != wroot) printf(" -> 선택 됨!"); printf("\n"); printf("Union-Find 집합 상태:"); for (int j = 0; j < n; j++) printf("[%d] ", u[j].parent); printf("\n\n"); } printf("최소 신장 트리의 가중치 합:%d", sum); free(h); free(e); return 0; }