#include <cstdio>
#include <algorithm>
using namespace std;
#define st first
#define nd second
#define make(b,c) make_pair(b,c);
const int N=2005, inf=1<<30;
int fu[N], ile, n;
int G[N][N];
int fuf(int a)
{
if (fu[a]==a) return a;
fu[a] = fuf( fu[a] );
return fu[a];
}
inline void fuu(int a,int b)
{
ile--;
fuf(a);
fuf(b);
for (int i=1;i<=n+1;i++) G[i][ fu[b] ] = G[ fu[b] ][i] = min( G[ fu[a] ][i], G[ fu[b] ][i] );
fu[ fu[a] ] = fu[b];
}
int main()
{
int a, k;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n+1;j++)
{
scanf("%d",&a);
G[i][j] = G[j][i] = a;
}
for (int i=1;i<=n+1;i++) G[i][0] = inf;
for (int i=1;i<=n+1;i++) fu[i] = i;
ile = n+1;
long long int wynik=0;
while ( ile > 1 )
{
// printf("lev\n");
for (int x=1;x<=n+1;x++)
if (fu[x]==x)
{
k = 0;
for (int i=1;i<=n+1;i++)
if ( fuf(i)!=x && G[x][i] < G[x][ k ]) k = i;
wynik += G[ x ][ k ];
fuu( k , x );
}
}
printf("%lld\n",wynik);
}
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 | #include <cstdio> #include <algorithm> using namespace std; #define st first #define nd second #define make(b,c) make_pair(b,c); const int N=2005, inf=1<<30; int fu[N], ile, n; int G[N][N]; int fuf(int a) { if (fu[a]==a) return a; fu[a] = fuf( fu[a] ); return fu[a]; } inline void fuu(int a,int b) { ile--; fuf(a); fuf(b); for (int i=1;i<=n+1;i++) G[i][ fu[b] ] = G[ fu[b] ][i] = min( G[ fu[a] ][i], G[ fu[b] ][i] ); fu[ fu[a] ] = fu[b]; } int main() { int a, k; scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=i+1;j<=n+1;j++) { scanf("%d",&a); G[i][j] = G[j][i] = a; } for (int i=1;i<=n+1;i++) G[i][0] = inf; for (int i=1;i<=n+1;i++) fu[i] = i; ile = n+1; long long int wynik=0; while ( ile > 1 ) { // printf("lev\n"); for (int x=1;x<=n+1;x++) if (fu[x]==x) { k = 0; for (int i=1;i<=n+1;i++) if ( fuf(i)!=x && G[x][i] < G[x][ k ]) k = i; wynik += G[ x ][ k ]; fuu( k , x ); } } printf("%lld\n",wynik); } |
English