Spanning Tree Minimum Cost Spanning Tree MST P

  • Slides: 26
Download presentation
擴展樹 (Spanning Tree)

擴展樹 (Spanning Tree)

花費最少擴張樹 (Minimum Cost Spanning Tree MST)

花費最少擴張樹 (Minimum Cost Spanning Tree MST)

P氏演算虛擬碼 T= { }; TV={0}; While(T<=Edgen-1) //令 (u , v) 是最少花費邊,且使得u屬於TV,但v不屬於TV { let (u

P氏演算虛擬碼 T= { }; TV={0}; While(T<=Edgen-1) //令 (u , v) 是最少花費邊,且使得u屬於TV,但v不屬於TV { let (u , v) be a least cost edge such that u belonged to TV and v not belonged to TV; if (no such edge) break; add v to TV ; add (u, v) to T; } if ( T < En-1) printf ( “No spanning tree n”);

P氏演算程式碼 l int a [N] , b [N] ; l typedef struct edge_node l

P氏演算程式碼 l int a [N] , b [N] ; l typedef struct edge_node l { l int i, j, w ; l struct edge_node l } EDGE_NODE; l EDGE_NODE *head = NULL ;

Prim( ) { int i, j, k ; EDGE_NODE *h , *p ; For

Prim( ) { int i, j, k ; EDGE_NODE *h , *p ; For ( i = 0 ; i < N ; i++ ) For ( j = i+1: j < N: j++ ) { If ( add_matrix [i][j] != MAX_I) pq_add (i, j, adj_matrix[i][j] ) ; add_set(a, i) ; rm_set( b, i ) ; }

rm_set ( a, 0 ) ; add_set ( b, 0 ) ; h =

rm_set ( a, 0 ) ; add_set ( b, 0 ) ; h = head ; for (k = 0 ; k < N – 1 ; k++) p=h; while ( ! ( in_set(a, p->i) && in_set ( b, p->i ))) { in_set( a, p->i )) p = p->next ; } if ( in_set ( a, p->i )) { rm_set ( a, p->i ) ; add_set ( b, p->i ) ; }

else { rm_set ( a, p->j ) ; add_set ( b, p->j ) ;

else { rm_set ( a, p->j ) ; add_set ( b, p->j ) ; } if ( h != p) { adjust_pq ( h, p ) ; h=p; } h = h->next ; } }

main ( ) { int i , j ; EDGE_NODE *p ; Prim (

main ( ) { int i , j ; EDGE_NODE *p ; Prim ( ) ; p = head; for ( i = 0; i < N – 1; i++) { printf ( “%d %d %dn”, p->i , p, >j , p->w ) ; p = p->next ; } }

l l l add_set ( int a [ ] , int n ) {

l l l add_set ( int a [ ] , int n ) { a [n] = 1 ; } rm_set ( int a [ ] , int n ) { a [n] = 0 ; } int_set ( int a [ ] , int n ) { return ( a [n] ); }

演算虛擬碼 T= { }; While(T<=En-1 and E is not empty) { choose a least

演算虛擬碼 T= { }; While(T<=En-1 and E is not empty) { choose a least edge (u , v) from E; delete(u, v) from E ; if ( (u , v) does not create a cycle in T ) add ( u , v) to T ; else discard (u , v); } if ( T < En-1) printf ( “No spanning tree n”);

演算程式碼 typedef struct edge_node { int vex 1, vex 2 ; int weight ;

演算程式碼 typedef struct edge_node { int vex 1, vex 2 ; int weight ; } EDGE_NODE ;

void kruskal ( EDGE_NODE edge_set [ ] , int mst [ ] ) {

void kruskal ( EDGE_NODE edge_set [ ] , int mst [ ] ) { int i, j, k, m 1, m 2 ; for ( i = 0; i < N ; i++ ) { init_set (s [i] ) ; add_set ( s [i] , i ) ; }

i=0; j=0; while ( i < N – 1 ) { for ( k

i=0; j=0; while ( i < N – 1 ) { for ( k = 0 ; k < N ; k++ ) { if ( in_set ( s [k], edge_set [j]. vex 1 ) m 1 = k ; if ( in_set ( s [k], edge_set [j]. vex 2 ) m 2 = k; } j ++; } }

if ( m 1 != m 2) { mst [i] = j ; i++

if ( m 1 != m 2) { mst [i] = j ; i++ ; union_set ( s [m 1], s [m 2] ) ; init_set ( s [m 2] ) ; } #define N 20 int s [N] ; init_set (int a [ ] ) { int i ; for ( i = 0 ; i< N ; i ++ ) a [i] = 0 ; }

union_set ( int a [ ] , int b [ ]) { int i

union_set ( int a [ ] , int b [ ]) { int i ; for ( i = 0 ; i < N ; i ++) a [i] = a [i] || b[i] ; }