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 을 반환합니다
}