// Krzysztof Piesiewicz // Kuglarz [A] PA 2014 #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int MAX_N = 2007, DB = 0; class Seg { public: int i, j, c; }; class Ve { public: int f; vector< Ve* > v; }; inline bool operator<( Seg a, Seg b ) { return a.c < b.c; } void update( Ve *v, int f ) { v->f = f; for( vector< Ve* >::iterator it = v->v.begin(); it != v->v.end(); it++ ) if( (*it)->f != f ) update( *it, f ); } int n, size, cnt; long long res; Seg s[ MAX_N * MAX_N ]; Ve g[ MAX_N ]; int main() { scanf( "%d", &n ); for( int i = 1; i <= n; i++ ) for( int j = i; j <= n; j++ ) { s[ size ].i = i; s[ size ].j = j; scanf( "%d", &s[ size++ ].c ); } for( int i = 0; i <= n; i++ ) g[ i ].f = i; sort( s, s + size ); for( int i = 0; i < size && cnt < n; i++ ) { if( DB ) printf( "i %d, c %d, %d - %d\n", i, s[ i ].c, s[ i ].i, s[ i ].j ); if( g[ s[ i ].i - 1 ].f != g[ s[ i ].j ].f ) { cnt++; res += s[ i ].c; g[ s[ i ].i - 1 ].v.push_back( &g[ s[ i ].j ] ); g[ s[ i ].j ].v.push_back( &g[ s[ i ].i - 1 ] ); update( &g[ s[ i ].j ], g[ s[ i ].i - 1 ].f ); } } printf( "%Ld\n", res ); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | // Krzysztof Piesiewicz // Kuglarz [A] PA 2014 #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int MAX_N = 2007, DB = 0; class Seg { public: int i, j, c; }; class Ve { public: int f; vector< Ve* > v; }; inline bool operator<( Seg a, Seg b ) { return a.c < b.c; } void update( Ve *v, int f ) { v->f = f; for( vector< Ve* >::iterator it = v->v.begin(); it != v->v.end(); it++ ) if( (*it)->f != f ) update( *it, f ); } int n, size, cnt; long long res; Seg s[ MAX_N * MAX_N ]; Ve g[ MAX_N ]; int main() { scanf( "%d", &n ); for( int i = 1; i <= n; i++ ) for( int j = i; j <= n; j++ ) { s[ size ].i = i; s[ size ].j = j; scanf( "%d", &s[ size++ ].c ); } for( int i = 0; i <= n; i++ ) g[ i ].f = i; sort( s, s + size ); for( int i = 0; i < size && cnt < n; i++ ) { if( DB ) printf( "i %d, c %d, %d - %d\n", i, s[ i ].c, s[ i ].i, s[ i ].j ); if( g[ s[ i ].i - 1 ].f != g[ s[ i ].j ].f ) { cnt++; res += s[ i ].c; g[ s[ i ].i - 1 ].v.push_back( &g[ s[ i ].j ] ); g[ s[ i ].j ].v.push_back( &g[ s[ i ].i - 1 ] ); update( &g[ s[ i ].j ], g[ s[ i ].i - 1 ].f ); } } printf( "%Ld\n", res ); return 0; } |