현재 위치 - 주공해몽공식사이트 - 랜덤 번호 뽑기 점술 - Prim 알고리즘이란 무엇입니까?

Prim 알고리즘이란 무엇입니까?

Prim 알고리즘

Prim 알고리즘은 무 지향성 그래프의 최소 스패닝 트리를 찾는 데 사용됩니다

스패닝 트리의 정점 세트가 u 인 그림 G =(V, e) 를 설정합니다.

1. v0 을 u 에 넣습니다.

(2) U, V-U 의 모든 가장자리 (U, V) E 에서 가중치가 가장 낮은 가장자리를 찾아 스패닝 트리에 추가합니다.

③ ② 에서 찾은 가장자리의 v 를 u 컬렉션에 추가합니다. U 세트에 N 개의 요소가 있으면 끝내고, 그렇지 않으면 계속 2 를 진행합니다.

알고리즘의 시간 복잡성은 O (n 2) 입니다.

Prim 알고리즘 구현:

(1) set: 배열 집합 [I] (I = 0, 1, ..., n- 1) 을 설정합니다. 초기값은 0 입니다

(2) 그림은 인접 행렬로 표현되며, 경로는 일반적으로 무한하지 않으며 컴퓨터에서 큰 정수로 대체될 수 있습니다.

인용 프로그램

/* prim.c.

Ctu_85 판권 소유 (c) 2002,2006

모든 권리를 보유하다.

*/

/* 힌지점 존재의 영향은 Prim 알고리즘에서는 무시할 수 있지만 Kruskal 알고리즘에서는 무시할 수 없습니다. */

#' stdio.h' 포함

# maxver/kloc 정의-0/0

# maxright/kloc 정의-0/00

Int main ()

{

Int G[maxver][maxver], in[maxver]=, path [maxver] [2];

Int I, j, k, min = maxright

Int v 1, v2, num, temp, status=0, start = 0;;

다시 시작:

Printf ("그림의 정점 수를 입력하십시오. \ n");

Scanf("%d ",& ampnum);

If(num & gt;; Maxver | | num<0)

{

Printf ("오류! 다시 입력해 주세요! \ n ");

재부팅으로 이동합니다.

}

For(j = 0;; J & ltnumj++)

For(k = 0;; K & ltnumk++)

{

다음 경우 (j==k)

G [j] [k] = maxright;

기타

If(j & lt;; K)

{

회신:

Printf ("정점 %d 과 정점 %d 사이의 오른쪽을 입력하십시오. 가장자리가 없으면-1:\n", j+ 1, k+/kloc 를 입력하십시오

Scanf("%d ",& amptemp);

If(temp & gt;; = maxright | | temp & lt- 1)

{

Printf ("잘못된 입력! \ n ");

Re 로 이동 :

}

If(temp==- 1)

Temp = maxright

G [j] [k] = g [k] [j] = temp;

}

}

For(j = 0;; J & ltnumj++)

{

상태 = 0;

For(k = 0;; K & ltnumk++)

If (g [j] [k] < Maxright) 를 참조하십시오

{

상태 =1;

깨뜨리다

}

다음 경우 (상태 ==0)

깨뜨리다

}

하다

{

Printf ("Prim 알고리즘이 시작되는 정점 입력:");

Scanf("%d ",& 시작);

} while (시작 < 0 | | 시작 및 gt num);

In [시작-1] =1;

For(I = 0;; 나< 번호-1& & amp 상태; I++)

{

For(j = 0;; J & ltnumj++)

For(k = 0;; K & ltnumk++)

If (g [j] [k] < 최소 & amp& amp 는 [j] & 에 있습니다 & amp (! In[k]))

{

V1= j;

V2 = k;;

Min = g [j] [k];

}

만약 (! [v2] 에서

{

Path [I] [0] = v1;

Path [I] [1] = v2;

In [v1] =1;

In [v2] =1;

Min = maxright

}

}

만약 (! 상태)

Printf ("그림이 연결되지 않기 때문에 우리는 그것을 처리할 수 없습니다! \ n ");

기타

{

For(I = 0;; 나< num-1; I++)

Printf("Path %d: 정점 %d 에서 정점 %d\n ",i+ 1, path [I] [0]+/kloc-0

}

1;

}

Prim 알고리즘입니다.

스패닝 트리의 정점 세트가 u 인 그림 G =(V, e) 를 설정합니다.

1. v0 을 u 에 넣습니다.

(2) U, V-U 의 모든 가장자리 (U, V) E 에서 가중치가 가장 낮은 가장자리를 찾아 스패닝 트리에 추가합니다.

③ ② 에서 찾은 가장자리의 v 를 u 컬렉션에 추가합니다. U 세트에 N 개의 요소가 있으면 끝내고, 그렇지 않으면 계속 2 를 진행합니다.

알고리즘의 시간 복잡성은 O (n 2) 입니다.

인용 프로그램

//Prim 알고리즘은 정점 수 (n) 와 면 수 (m) 를 읽고 가장자리의 시작과 가중치는 인접 행렬에 저장됩니다.

//예

//7 12 (7 개의 정점 12 개의 가장자리)

// 1 2 2

// 1 4 1

// 1 3 4

//2 4 3

//2 5 10

//3 4 2

//4 5 7

//3 6 5

//4 6 8

//4 7 4

//5 7 6

//6 7 1

# include & ltstdio.h & gt

# include & ltstring.h & gt

Int main ()

{

Int m, n;

Int a[20 1][20 1], 마크 [201], pre [20/kloc-;

Int s, t, w;

Int I, j, k, min, tot

Freopen("Prim.txt ","r ",stdin);

//데이터 읽기

메셋 (a, 0, sizeof(a)););

Scanf("%d %d ",& ampn & amp;; M);

For(I = 0;; 나 & ltm;; I ++)

{

Scanf("%d %d %d ",& amps & amp;; T & amp;; W);

A [s] [t] = w; A [t] [s] = w;

}

//초기 값 할당

Memset (마크, 0, sizeof (마크));

메셋 (pre, 0, sizeof(pre)););

메셋 (dist, 9999, sizeof(dist)););

Dist [1] = 0;

//Prim

For (I =1; 나<= n;; I ++)

{

Min = 9999k = 0;;

For (j =1; J<= n;; J ++)

If ((마크 [j] = = 0) & & amp (dist [j] < Min)) {min = dist [j]; K = j;; }

If (k = = 0) break;

마크 [k] =1;

For (j =1; J<= n;; J ++)

If ((마크 [j] = = 0) & & amp (a [k] [j] < Dist [j]) & & amp (a [k] [j] > 0)) 을 참조하십시오

{

Dist [j] = a [k] [j];

Pre [j] = k;

}

}

Tot = 0;;

For (I =1; 나<= n;; I++) tot+= dist [I];

Printf("%d\n ",tot);

0 을 반환합니다

}