Kruskal算法 (並查集)

Kruskal算法(並查集)

數據:

int root[]:存放節點的根,初始化時候全部等於本身。

struct node{

   int x,y,distance;

   void set ( int a, int b, int w ) { x=a,y=b,distance=w; }

   }Node[];

   :存放圖,定點,x,y.距離distance.

void cmp():比較函數,給qsort函數,用來按照distance從小到大排序。

void init() 初始化root[];

find函數:查找節點x的根節點。

merge函數,更新節點的根節點。

int sum:記錄權值和。

int c.邊數。

 

代碼:

bool cmp ( const node &a, const node &b ) {

          return a.distance < b.distance;

}

void init () {

     for ( int i = 0; i <= N; ++ i )

          root[i] = i;

}

int find ( int x ) {

    return x != root[x] ? find ( root[x] ) : x;

}

void merge ( int x, int y ) {

     x = find ( x );

     y = find ( y );

     if ( x == y ) return;

     root[y] = x;

}

 

int main()

{

  init ();

           memset ( Node, 0, sizeof ( Node ) );

           int c = 0;

           for ( int i = 1; i <= N; ++ i ) {

                for ( int j = 1; j <= N; ++ j ) {

                     scanf ( "%d", &w );

                     Node[c++].set ( i,j,w );

                }

           }

           sort ( Node, Node + c, cmp );

           int sum = 0;

           for ( int i = 0 ; i < c; ++ i ) {

                if ( find ( Node[i].x ) != find ( Node[i].y ) ) {

                    sum += Node[i].distance;

                    merge ( Node[i].x, Node[i].y );

                }

           }

           printf ( "%d/n", sum );

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章