최소 스패닝 트리 - 크루스 칼 알고리즘

최소 스패닝 트리 - 크루스 칼 알고리즘

알고리즘

1.도 모든 케이블은 정점을 떠나, 제거

2. 측면의 두 정점을 연결하는도 3의 어레이의 측 가장자리에서 설정된 최소 가중치를 찾기

3.이 같은 선택된 최소 스패닝 트리 에지 루프가 나타나면, 가장자리가 삭제되어, 다음 작은 값 옵션 가장자리 사이의 정점을 연결하는 최소 무게 가장자리를 찾기 위해 계속

4 정점 모두가 함께 연결하고 더 루프가 없을 때까지 최소 스패닝 트리가 생성됩니다.

 

크루스 칼 알고리즘 코드

// 통신 네트워크에서 최소 스패닝 트리의 값

#INCLUDE <STDIO.H>

사용법 #include <stdlib.h>

 

#DEFINE의 MAXEDGE 20

#DEFINE MAXVEX 20

#DEFINE의 INFINITY 65535

 

타입 정의 구조체

{

    INT 호 [MAXVEX] MAXVEX];

    INT numVertexes, numEdges; // 정점의 수, 모서리의 수

Ngrf};

 

타입 정의 구조체

{

    INT 시작;

    INT 끝;

    무게를 int로;

} 에지, 배열 에지 구조의 가장자리 // 정의

 

인접성 매트릭스를 생성 //

보이드 CreateMGraph (MGraph * G) {

    int로 I, J;

 

    G-> numEdges = 11;

    G-> numVertexes = 7;

 

    대 (I = 0; I <G-> numVertexes; 내가 ++) {

        (; J <G-> numVertexes, J ++ J = 0) {대

            경우 (I == J)

                G-> 호 [I]는 [j]가 = 0;

            그밖에

                G-> 호 [I] [J] = G-> 호 [J] [i가 = INFINITY;

        }

    }

    G-> 호 [0] [1] = 7;

    G-> 호 [0] [3] = 5;

    G-> 호 [1] [2] = 8;

    G-> 호 [1] [3] = 9;

    G-> 호 [1] [4] = 7;

    G-> 호 [2] [4] = 5;

    G-> 호 [3] [4] = 15;

    G-> 호 [3] [5] = 6;

    G-> 호 [4] [5] = 8;

    G-> 호 [4] [6] = 9;

    G-> 호 [5] [6] = 11;

 

    대 (I = 0; I <G-> numVertexes; 내가 ++) {

        (; J <G-> numVertexes, J ++ J = 1) {대

            G-> 호 [J] [I] = G-> 호 [I] [J]

        }

    }

 

}

 

// 조건의 빠른 정렬

INT의 CMP (CONST 무효 *는, * CONST 공극의 b) {

    창 (* EDGE (*) a) .weight - (* EDGE (*) b) .weight;

}

 

// 루트를 찾을 수

INT {(INT * 부모 INT의 F)를 찾기

    반면 (부모 [F]> 0) {

        상위 F = [F]

    }

    F를 반환;

}

 

// 최소 스패닝 트리를 생성

무효화 MiniSpanTree_Kruskal (MGraph G) {

    I, J, N, m 값 int;

    INT의 K = 0;

    INT 부모 [MAXVEX]; // 배열의 루트 노드를 찾기위한

 

    에지 가장자리 [MAXEDGE]; // 어레이의 에지를 정의하는, 시작, 종료 등의 가장자리 구조 중량 정수

 

    // 배열 에지 정렬 된 세트 (어레이에 집합 인접 행렬의 우측의 사선 부)를 구성하는 데 사용

    대 (I = 0; I는 <G.numVertexes-1; 내가 ++) {

        에 대한 (j = 1 + 1, J <G.numVertexes, J ++) {

            경우 (G.arc [I] [J] <INFINITY) {

                에지 [K]가 .begin = 난; // 작은 노드 번호 향하고

                에지 [K] = .END J // 노드의 수가 많은 꼬리

                에지 [K] .weight G.arc = [I] [J]

                K ++;

            }

        }

    }

 

    // 배열을 정렬하는 가장자리 에지의 집합이며

    (15.3 가장자리 G.numEdges,는 sizeof (에지), CMP);

 

    대 (I = 0; i가 G.numVertexes를 <; 내가 ++)

        부모 [I] = 0;

 

    의 printf ( "인쇄 최소 스패닝 트리 : \ n을");

    대 (I = 0; i가 G.numEdges를 <; 내가 ++) {

        N = 찾기 (상위 에지 [I] .begin) // 여기서 트리 에지 측이 [I]는 "첫 번째 노드"뿌리 찾기

        m = 찾기 (상위 가장자리는 [I]는 .END) // 트리 가장자리 측 [I]가 "꼬리 노드"루트를 찾아

 

        // 경우 n 및 나무에 설명되지 않은 두 정점에서부터 M, 그래서이 측 가장자리 세트 선택된 발생 회로에 추가되었다 일으키지 않는다

        경우 (N! = m) {

            부모 [N]를 m =;

            의 printf ( "(%의 D %의 D)가 % d \ 없음"에지 [I] .begin 가장자리 [I] .END 가장자리 [I] .weight);

        }

    }

}

 

메인 INT (공극)

{

    MGraph G;

    CreateMGraph (G)를;

    MiniSpanTree_Kruskal (G);

 

    0을 반환;

}

원본 링크 : HTTPS : //blog.csdn.net/junya_zhang/article/details/83584592

원본 링크 : https://blog.csdn.net/hhu1506010220/article/details/51971717

추천

출처www.cnblogs.com/yuanch2019/p/11578715.html