题意:
应该就是装宽带网络,给定节点和有权值的边的数目,问最小的成本是多少。
思路:
Prim模板,第一次
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 55
#define INF 0x7f7f7f7f
using namespace std;
int n, m;
int edg[ N ][ N ];
int dis[ N ];
bool vis[ N ];
void Prim () {
int ans = 0;
// INIt
memset ( vis, false, sizeof ( vis ) );
vis[ 1 ] = true;
for ( int i = 1; i <= n; ++i ) {
dis[ i ] = edg[ 1 ][ i ];
}
// u = Extract MIN
for ( int i = 1; i <= n; ++i ) {
int x = -1, mi = INF;
for ( int j = 1; j <= n; ++j )
if ( !vis[ j ] && dis[ j ] < mi )
mi = dis[ x = j ];
if ( x == -1 )
break;
//出列后标记
vis[ x ] = true;
ans += mi;
// for each v in G.adj[u]
for ( int j = 1; j <= n; ++j )
// if v in Q and w(u,v) < v.key
// 和dijkstra不一样的地方
if ( !vis[ j ] && dis[ j ] > edg[ x ][ j ] )
dis[ j ] = edg[ x ][ j ];
}
printf ( "%d\n", ans );
}
int main () {
while ( ~scanf ( "%d", &n ) && n ) {
scanf ( "%d", &m );
if ( !m ) {
printf ( "0\n" );
continue;
}
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= n; ++j ) {
if ( i == j )
edg[ i ][ j ] = 0;
else
edg[ i ][ j ] = INF;
}
for ( int i = 1; i <= m; ++i ) {
int u, v, w;
scanf ( "%d%d%d", &u, &v, &w );
if ( w < edg[ u ][ v ] )
edg[ u ][ v ] = edg[ v ][ u ] = w;
}
Prim ();
}
return 0;
}