Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 Kruskal의 최소 스패닝 트리 알고리즘-탐욕 알고리즘

<시간/>

스패닝 트리는 모든 정점을 연결하는 연결되고 방향이 없는 그래프 하위 그래프입니다. 그래프에는 많은 확장 트리가 있을 수 있습니다. 각 그래프의 최소 신장 트리(MST)는 다른 모든 신장 트리보다 가중치가 같거나 작습니다. 가중치는 스패닝 트리의 가장자리에 할당되고 합은 각 가장자리에 할당된 가중치입니다. V가 그래프의 정점 수이므로 최소 스패닝 트리의 간선은 (V - 1)이며, 여기서 V는 간선의 수입니다.

Kruskal 알고리즘을 사용하여 최소 신장 트리 찾기

  • 모든 가장자리는 내림차순이 아닌 가중치 순서로 정렬되어야 합니다.

  • 가장 작은 모서리를 선택하십시오. 이 에지는 싸이클이 형성되지 않은 경우에 포함됩니다.

  • 스패닝 트리가 (V-1) 에지를 가질 때까지 2단계를 수행해야 합니다.

이 시나리오에서는 탐욕스러운 방법을 사용하라는 지시를 받습니다. greedy 옵션은 가중치가 가장 적은 가장자리를 선택하는 것입니다. 예를 들어, 이 그래프의 최소 스패닝 트리는 (9-1)=8개의 모서리입니다.

C++에서 Kruskal의 최소 스패닝 트리 알고리즘-탐욕 알고리즘

정렬 후:무게 Src Dest21 27 2622 28 2222 26 2524 20 2124 22 2526 28 2627 22 2327 27 2828 20 2728 21 3 25229 4 3 

이제 정렬에 따라 모든 가장자리를 선택해야 합니다.

에지 26-27-> 사이클이 형성되지 않았기 때문에 포함됨

에지 28-22-> 사이클이 형성되지 않았기 때문에 포함됨

에지 26-25-> 사이클이 형성되지 않아 포함됩니다.

에지 20-21-> 사이클이 형성되지 않아 포함됨

에지 22-25-> 사이클이 형성되지 않아 포함됨

에지 28-26-> 주기가 형성되면서 폐기됨

에지 22-23-> 사이클이 형성되지 않아 포함됨

에지 27-28-> 주기가 형성되면서 폐기됨

에지 20-27-> 사이클이 형성되지 않아 포함됨

에지 21-22-> 주기가 형성되면서 폐기됨

에지 23-24-> 사이클이 형성되지 않았기 때문에 포함됨

에지의 개수가 (V-1)이므로 알고리즘은 여기서 끝납니다.

예시

#include #include #include struct Edge { int src, dest, weight;};struct Graph { int V, E; struct Edge* edge;};struct Graph* createGraph(int V, int E){ struct Graph* graph =(struct Graph*)(malloc(sizeof(struct Graph))); 그래프->V =V; 그래프->E =E; 그래프->가장자리 =(구조체 Edge*)malloc(sizeof(구조체 Edge)*E); 반환 그래프;}구조체 하위 집합 { int 부모; int rank;};int find(구조체 하위 집합[], int i){ if (subsets[i].parent !=i) 하위 집합[i].parent =find(하위 집합, 하위 집합[i].parent); 반환 하위 집합[i].parent;}void Union(구조체 하위 집합 하위 집합[], int x, int y){ int xroot =find(subsets, x); int yroot =찾기(부분집합, y); if (하위 집합[xroot].rank <하위 집합[yroot].rank) 하위 집합[xroot].parent =yroot; else if (하위 집합[xroot].rank> 하위 집합[yroot].rank) 하위 집합[yroot].parent =xroot; else{ 부분집합[yroot].parent =xroot; 하위 집합[xroot].rank++; }}int myComp(const void* a, const void* b){ struct Edge* a1 =(struct Edge*)a; struct Edge* b1 =(구조체 Edge*)b; return a1->weight> b1->weight;}void KruskalMST(struct Graph* graph){ int V =graph->V; 구조체 에지 결과[V]; 정수 e =0; 정수 i =0; qsort(그래프->가장자리, 그래프->E, sizeof(그래프->가장자리[0]), myComp); struct 부분집합* 부분집합 =(구조체 부분집합*)malloc(V * sizeof(구조체 부분집합)); for (int v =0; v E) { struct Edge next_edge =그래프->edge[i++]; int x =찾기(하위 집합, next_edge.src); int y =찾기(하위 집합, next_edge.dest); if (x !=y) { 결과[e++] =next_edge; 합집합(부분집합, x, y); } } printf("다음은 구성된 MST의 가장자리입니다.\n"); 정수 최소 비용 =0; for (i =0; i 가장자리[0].src =20; 그래프->가장자리[0].dest =21; 그래프->가장자리[0].가중치 =30; 그래프->가장자리[1].src =20; 그래프->가장자리[1].dest =22; 그래프->가장자리[1]. 가중치 =26; 그래프->가장자리[2].src =20; 그래프->가장자리[2].dest =23; 그래프->가장자리[2]. 가중치 =25; 그래프->가장자리[3].src =21; 그래프->가장자리[3].dest =23; 그래프->가장자리[3]. 가중치 =35; 그래프->가장자리[4].src =22; 그래프->가장자리[4].dest =23; 그래프->가장자리[4]. 가중치 =24; 크루스칼MST(그래프); 반환 0;}

출력

구성된 MST22 -- 23 ==2420 -- 23 ==2520 -- 21 ==30Minimum Cost Spanning tree :79

결론

이 튜토리얼에서는 Kruskal의 최소 스패닝 트리 알고리즘-그리디(Minimum Spanning Tree Algorithm-Greedy) 방법과 C++ 코드를 사용하여 이 문제를 해결하는 방법을 보여주었습니다. 우리는 또한 자바, 파이썬 및 기타 언어로 이 코드를 작성할 수 있습니다. 그것은 Kruskal의 개념에 의해 모델링되었습니다. 이 프로그램은 주어진 그래프에서 가장 짧은 스패닝 트리를 찾습니다. 이 튜토리얼이 도움이 되기를 바랍니다.