#include <cstdio> #include <algorithm> using namespace std; const int MAX = 2005; struct edg { int c; int p, k; }; edg mkEdg(int c, int p, int k) { edg x; x.c=c; x.p=p; x.k=k; return x; } bool operator<(edg a, edg b) { return a.c<b.c; } int kos[MAX][MAX]; edg t[MAX*MAX]; int com[MAX]; #warning LONG LONGI!!!!! int main() { int n, it=0, sm; long long w=0LL; int l=0; scanf("%d", &n); for (int i=0; i<n; i++) { for (int j=i; j<n; j++) { scanf("%d", &kos[i][j]); t[it]=mkEdg(kos[i][j], i, j+1); it++; } } //for (int i=0; i<n; i++) {for (int j=0; j<n; j++) printf(" %d,", kos[i][j]); printf("\n");} int siz=(n*(n+1))/2; sort(t, t+siz); //for (int i=0; i<siz; i++) printf(" %d, %d %d\n", t[i].c, t[i].p, t[i].k); for (int i=0; i<n+1; i++) com[i]=i; for (int i=0; i<siz; i++) { if (l==n) break; //rozważam t[i]; if (com[t[i].p]==com[t[i].k]) continue; sm=com[t[i].k]; for (int j=0; j<n+1; j++) if (com[j]==sm) com[j]=com[t[i].p]; l++; w+=t[i].c; } printf("%lld\n", w); return 0; //ADG }
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <cstdio> #include <algorithm> using namespace std; const int MAX = 2005; struct edg { int c; int p, k; }; edg mkEdg(int c, int p, int k) { edg x; x.c=c; x.p=p; x.k=k; return x; } bool operator<(edg a, edg b) { return a.c<b.c; } int kos[MAX][MAX]; edg t[MAX*MAX]; int com[MAX]; #warning LONG LONGI!!!!! int main() { int n, it=0, sm; long long w=0LL; int l=0; scanf("%d", &n); for (int i=0; i<n; i++) { for (int j=i; j<n; j++) { scanf("%d", &kos[i][j]); t[it]=mkEdg(kos[i][j], i, j+1); it++; } } //for (int i=0; i<n; i++) {for (int j=0; j<n; j++) printf(" %d,", kos[i][j]); printf("\n");} int siz=(n*(n+1))/2; sort(t, t+siz); //for (int i=0; i<siz; i++) printf(" %d, %d %d\n", t[i].c, t[i].p, t[i].k); for (int i=0; i<n+1; i++) com[i]=i; for (int i=0; i<siz; i++) { if (l==n) break; //rozważam t[i]; if (com[t[i].p]==com[t[i].k]) continue; sm=com[t[i].k]; for (int j=0; j<n+1; j++) if (com[j]==sm) com[j]=com[t[i].p]; l++; w+=t[i].c; } printf("%lld\n", w); return 0; //ADG } |