p1406.cpp
来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 71 行
CPP
71 行
// zju 1406
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ( "p.in" );
ofstream out ( "p.out" );
int N;
int dis [26] [26];
void init ()
{
int i , j , tot , t;
char ch1 , ch2;
memset ( dis , 0xff , sizeof ( dis ));
for ( i = 0; i + 1 < N; i ++ ) {
in >> ch1 >> tot;
for ( j = 0; j < tot; j ++ ) {
in >> ch2 >> t;
dis [ch1 - 'A'] [ch2 - 'A'] = t;
dis [ch2 - 'A'] [ch1 - 'A'] = t;
}
}
}
int Prim ()
{
bool Reach [26] = {false};
int Min [26];
int i , j , k , ret = 0;
Reach [0] = 1;
for ( i = 0; i < N; i ++ )
Min [i] = dis [0] [i];
Min [0] = 0;
for ( i = 1; i < N; i ++ ) {
k = -1;
for ( j = 1; j < N; j ++ ) if ( !Reach [j] && Min [j] != -1 )
if ( k == -1 || Min [j] < Min [k] ) k = j;
ret += Min [k];
Reach [k] = 1;
for ( j = 1; j < N; j ++ ) if ( !Reach [j] && dis [k] [j] != -1 )
if ( Min [j] == -1 || Min [j] > dis [k] [j] )
Min [j] = dis [k] [j];
}
return ret;
}
int main(int argc, char* argv[])
{
while ( in >> N , N ) {
init ();
out << Prim () << endl;
}
return 0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?