洛谷博客
一、Kruskal
P3366 【模板】最小生成树
# include <stdio.h>
# include <algorithm>
# include <iostream>
using namespace std;
# define MAXN 200005
int n, m, cnt, flag, ans;
struct node {
int u, v, w;
} map[ MAXN] ;
void add ( int u, int v, int w) {
map[ ++ cnt] = ( node) { u, v, w} ;
}
bool cmp ( node a, node b) {
return a. w < b. w;
}
int prn[ MAXN] ;
int find ( int x) {
if ( prn[ x] == x) return x;
return prn[ x] = find ( prn[ x] ) ;
}
void Union ( int x, int y) {
int t1, t2;
t1 = find ( x) ;
t2 = find ( y) ;
if ( t1 != t2) prn[ t1] = t2;
}
bool kruskal ( ) {
sort ( map+ 1 , map+ 1 + m, cmp) ;
for ( int i= 1 ; i<= n; i++ ) prn[ i] = i;
for ( int i= 1 ; i<= m; i++ ) {
int t1 = find ( map[ i] . u) ;
int t2 = find ( map[ i] . v) ;
if ( t1 == t2) continue ;
Union ( t1, t2) ;
ans += map[ i] . w;
if ( ++ flag == n- 1 ) return 1 ;
}
return 0 ;
}
int main ( void )
{
cin >> n >> m;
for ( int i= 1 ; i<= m; i++ ) {
int u, v, w;
cin >> u >> v >> w;
add ( u, v, w) ;
}
if ( kruskal ( ) ) cout << ans;
else cout << "orz" ;
return 0 ;
}
二、Prim
# include <stdio.h>
# include <string.h>
# include <algorithm>
# include <iostream>
using namespace std;
# define MAXN 400005
int n, m, ans;
int cnt;
int head[ MAXN] ;
struct node {
int to, next, w;
} map[ MAXN] ;
void add ( int u, int v, int w) {
map[ ++ cnt] = ( node) { v, head[ u] , w} ;
head[ u] = cnt;
}
int dis[ MAXN] , vis[ MAXN] ;
void prim ( ) {
memset ( dis, 0x3f , sizeof ( dis) ) ;
dis[ 1 ] = 0 ;
int min, u;
for ( int i= 1 ; i<= n; i++ ) {
min = 0x3f3f3f3f ;
for ( int k= 1 ; k<= n; k++ ) {
if ( ! vis[ k] && min> dis[ k] ) {
min = dis[ k] ;
u = k;
}
}
vis[ u] = 1 ;
ans += min;
for ( int k= head[ u] ; k; k= map[ k] . next) {
int v = map[ k] . to;
int w = map[ k] . w;
if ( dis[ v] > w && ! vis[ v] ) {
dis[ v] = w;
}
}
}
}
int main ( void )
{
cin >> n >> m;
for ( int i= 1 ; i<= m; i++ ) {
int u, v, w;
cin >> u >> v >> w;
add ( u, v, w) ;
add ( v, u, w) ;
}
prim ( ) ;
cout << ans;
return 0 ;
}