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