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 );
}