邻接矩阵
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x7FFFFFFF
int G[ 500 ] [ 500 ] , visited[ 500 ] , W[ 500 ] ;
int Prim ( int N )
{
int sumW = 0 , v;
for ( int i = 0 ; i < N; ++ i )
{
int min = INF;
for ( int j = 0 ; j < N; ++ j )
if ( ! visited[ j] && W[ j] < min )
{
min = W[ j] ;
v = j;
}
sumW + = W[ v] ;
visited[ v] = 1 ;
if ( min == INF )
return sumW;
for ( int j = 0 ; j < N; ++ j )
if ( ! visited[ j] && W[ j] > G[ v] [ j] )
W[ j] = G[ v] [ j] ;
}
return sumW;
}
int main ( )
{
int N, M, a, b, w;
scanf ( "%d %d" , & N, & M) ;
fill ( G[ 0 ] , G[ 0 ] + 500 * 500 , INF ) ;
fill ( W, W + N, INF ) ;
W[ 0 ] = 0 ;
for ( int i = 0 ; i < M; ++ i )
{
scanf ( "%d %d %d" , & a, & b, & w) ;
G[ a] [ b] = G[ b] [ a] = w;
}
printf ( "%d" , Prim ( N) ) ;
}
邻接表
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define INF 0x7FFFFFFF
typedef struct
{ int w, adj; } Arcnode;
vector< vector< Arcnode>> G;
vector< int > visited, W;
int Prim ( int N )
{
int v, sumW = 0 ;
for ( int i = 0 ; i < N; ++ i )
{
int min = INF;
for ( int j = 0 ; j < N; ++ j )
if ( ! visited[ j] && min > W[ j] )
{
min = W[ j] ;
v = j;
}
if ( min == INF )
return sumW;
sumW + = min;
visited[ v] = 1 ;
for ( int j = 0 ; j < G[ v] . size ( ) ; ++ j )
if ( ! visited[ G[ v] [ j] . adj ] && W[ G[ v] [ j] . adj ] > G[ v] [ j] . w )
W[ G[ v] [ j] . adj ] = G[ v] [ j] . w;
}
return sumW;
}
int main ( )
{
int N, M, V, a, b, w;
Arcnode temp;
scanf ( "%d %d" , & N, & M) ;
G. resize ( N ) ;
visited. resize ( N ) ;
W. resize ( N ) ;
fill ( W. begin ( ) , W. end ( ) , INF ) ;
W[ 0 ] = 0 ;
for ( int i = 0 ; i < M; ++ i )
{
scanf ( "%d %d %d" , & a, & b, & w) ;
temp = { w, b } ;
G[ a] . push_back ( temp) ;
temp = { w, a } ;
G[ b] . push_back ( temp) ;
}
printf ( "%d" , Prim ( N) ) ;
}
测试用例:
6 10
0 1 4
0 4 1
0 5 2
1 2 6
1 5 3
2 3 6
2 5 5
3 4 4
3 5 5
4 5 3