[Prim] POJ 1287
来源:互联网 发布:最大的整型数据 编辑:程序博客网 时间:2024/05/17 04:49
题意:
应该就是装宽带网络,给定节点和有权值的边的数目,问最小的成本是多少。
思路:
Prim模板,第一次
#include <algorithm>#include <cstdio>#include <cstring>#define N 55#define INF 0x7f7f7f7fusing 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;}
阅读全文