#include <stdio.h>
#include <stdlib.h>
#define MX 2000000000;
// szanowne jury - nie mam pomyslu
int isOne(int *t, int a, int b) {
int s,r;
if (a>b) {
s = a; a = b; b = s;
}
s = b-a;
r = -1;
for (;a<=b;a++) {
if (t[a]) s--;
else r = a;
}
return s==0 ? r : -1;
}
int main() {
int n,i,j,a,c,k,l;
int **g;
int *next;
int *view,*pv, *lv;
int *weight;
long long int s;
scanf("%d", &n);
g = malloc(n*sizeof(*g));
next = malloc(n*sizeof(*next));
view = malloc(n*sizeof(*view));
pv = malloc(n*sizeof(*pv));
lv = malloc(n*sizeof(*lv));
weight = malloc(n*sizeof(*weight));
for (i=0; i<n; ++i)
g[i] = malloc(n*sizeof(**g));
for (i=0; i<n; ++i) {
for (j=i; j<n; ++j) {
scanf("%d", &a);
g[i][j] = g[j][i] = a;
}
weight[i] = g[i][i];
pv[i] = i;
lv[i] = i;
}
for (i=0; i<n; ++i) {
next[i] = view[i] = 0;
}
for (j=0; j<n; ++j) {
// printf("===================\n");
// for (i=0;i<n;++i) printf("%d", view[i]);
// printf("\n");
for (k=0; k<n; ++k) {
for (i=k; i<n; ++i) {
c = isOne(view, k, i);
if (c >= 0 && weight[c] > g[k][i]) {
weight[c] = g[k][i];
pv[c] = k;
lv[c] = i;
}
}
}
// for (i=0; i<n; ++i) printf("%d - %d %d\n", weight[i], pv[i]+1, lv[i]+1);
a = MX;
for (i=0; i<n; ++i) {
if (!view[i] && weight[i] < a ) {
a = weight[i];
c = i;
}
}
// printf("%d %d\n", pv[c]+1, lv[c]+1);
view[c] = 1;
}
// */
s = 0;
for (i=0; i<n; ++i) {
// printf("%d\n", weight[i]);
s += weight[i];
}
printf("%Ld\n", s);
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <stdio.h> #include <stdlib.h> #define MX 2000000000; // szanowne jury - nie mam pomyslu int isOne(int *t, int a, int b) { int s,r; if (a>b) { s = a; a = b; b = s; } s = b-a; r = -1; for (;a<=b;a++) { if (t[a]) s--; else r = a; } return s==0 ? r : -1; } int main() { int n,i,j,a,c,k,l; int **g; int *next; int *view,*pv, *lv; int *weight; long long int s; scanf("%d", &n); g = malloc(n*sizeof(*g)); next = malloc(n*sizeof(*next)); view = malloc(n*sizeof(*view)); pv = malloc(n*sizeof(*pv)); lv = malloc(n*sizeof(*lv)); weight = malloc(n*sizeof(*weight)); for (i=0; i<n; ++i) g[i] = malloc(n*sizeof(**g)); for (i=0; i<n; ++i) { for (j=i; j<n; ++j) { scanf("%d", &a); g[i][j] = g[j][i] = a; } weight[i] = g[i][i]; pv[i] = i; lv[i] = i; } for (i=0; i<n; ++i) { next[i] = view[i] = 0; } for (j=0; j<n; ++j) { // printf("===================\n"); // for (i=0;i<n;++i) printf("%d", view[i]); // printf("\n"); for (k=0; k<n; ++k) { for (i=k; i<n; ++i) { c = isOne(view, k, i); if (c >= 0 && weight[c] > g[k][i]) { weight[c] = g[k][i]; pv[c] = k; lv[c] = i; } } } // for (i=0; i<n; ++i) printf("%d - %d %d\n", weight[i], pv[i]+1, lv[i]+1); a = MX; for (i=0; i<n; ++i) { if (!view[i] && weight[i] < a ) { a = weight[i]; c = i; } } // printf("%d %d\n", pv[c]+1, lv[c]+1); view[c] = 1; } // */ s = 0; for (i=0; i<n; ++i) { // printf("%d\n", weight[i]); s += weight[i]; } printf("%Ld\n", s); return 0; } |
English