/*
* File: kug.cpp
* Author: baca
*
* Created on 13 maj 2014, 16:47
*/
#include <cstdlib>
#include <iostream>
#include <vector>
#include <utility>
#include <cstring>
#include <algorithm>
using namespace std;
int n, i, j, k, l = 0, x, from, to;
long long tmp, suma = 0;
bool b;
vector< pair<long long, pair<int, int> > > c;
bool comp_c(pair<long long, pair<int, int> > c1, pair<long long, pair<int, int> > c2) {
return c1.first < c2.first;
}
int main(int argc, char** argv) {
cin.sync_with_stdio(false);
scanf("%d", &n);
c.reserve(n * (n - 1) / 2);
for (i = 1; i <= n; i++) {
for (j = i; j <= n; j++) {
scanf("%lld", &tmp);
c.push_back(make_pair(tmp, make_pair(i, j)));
}
}
sort(c.begin(), c.end(), comp_c);
// for (vector< pair<long long, pair<int, int> > >::iterator it = c.begin(); it!=c.end(); ++it) {
// printf("%lld %d %d\n", it->first, it->second.first, it->second.second);
// }
bool ** s;
s = new bool*[n + 1];
for (i = 1; i <= n; i++) {
s[i] = new bool[n + 1];
memset(s[i], 0, n + 1);
}
vector< pair<long long, pair<int, int> > >::iterator it = c.begin();
while (l < n && it!=c.end()) {
from = it->second.first;
to = it->second.second;
b = true;
for (k = 1; k < from; k++) {
if (s[k][from - 1] && s[k][to]) {
b = false;
break;
}
}
if (b) {
for (k = from; k < to; k++) {
if (s[from][k] && s[k + 1][to]) {
b = false;
break;
}
}
}
if (b) {
for (k = to + 1; k <= n; k++) {
if (s[from][k] && s[to + 1][k]) {
b = false;
break;
}
}
}
if (b) {
suma += it->first;
++l;
s[from][to] = true;
for (k = 1; k < from; k++) {
if (s[k][from - 1]) {
s[k][to] = true;
} else if (s[k][to]) {
s[k][from - 1] = true;
}
}
for (k = from; k < to; k++) {
if (s[from][k]) {
s[k + 1][to] = true;
} else if (s[k + 1][to]) {
s[from][k] = true;
}
}
for (k = to + 1; k <= n; k++) {
if (s[from][k]) {
s[to + 1][k] = true;
} else if (s[to + 1][k]) {
s[from][k] = true;
}
}
}
++it;
}
printf("%lld\n", suma);
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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | /* * File: kug.cpp * Author: baca * * Created on 13 maj 2014, 16:47 */ #include <cstdlib> #include <iostream> #include <vector> #include <utility> #include <cstring> #include <algorithm> using namespace std; int n, i, j, k, l = 0, x, from, to; long long tmp, suma = 0; bool b; vector< pair<long long, pair<int, int> > > c; bool comp_c(pair<long long, pair<int, int> > c1, pair<long long, pair<int, int> > c2) { return c1.first < c2.first; } int main(int argc, char** argv) { cin.sync_with_stdio(false); scanf("%d", &n); c.reserve(n * (n - 1) / 2); for (i = 1; i <= n; i++) { for (j = i; j <= n; j++) { scanf("%lld", &tmp); c.push_back(make_pair(tmp, make_pair(i, j))); } } sort(c.begin(), c.end(), comp_c); // for (vector< pair<long long, pair<int, int> > >::iterator it = c.begin(); it!=c.end(); ++it) { // printf("%lld %d %d\n", it->first, it->second.first, it->second.second); // } bool ** s; s = new bool*[n + 1]; for (i = 1; i <= n; i++) { s[i] = new bool[n + 1]; memset(s[i], 0, n + 1); } vector< pair<long long, pair<int, int> > >::iterator it = c.begin(); while (l < n && it!=c.end()) { from = it->second.first; to = it->second.second; b = true; for (k = 1; k < from; k++) { if (s[k][from - 1] && s[k][to]) { b = false; break; } } if (b) { for (k = from; k < to; k++) { if (s[from][k] && s[k + 1][to]) { b = false; break; } } } if (b) { for (k = to + 1; k <= n; k++) { if (s[from][k] && s[to + 1][k]) { b = false; break; } } } if (b) { suma += it->first; ++l; s[from][to] = true; for (k = 1; k < from; k++) { if (s[k][from - 1]) { s[k][to] = true; } else if (s[k][to]) { s[k][from - 1] = true; } } for (k = from; k < to; k++) { if (s[from][k]) { s[k + 1][to] = true; } else if (s[k + 1][to]) { s[from][k] = true; } } for (k = to + 1; k <= n; k++) { if (s[from][k]) { s[to + 1][k] = true; } else if (s[to + 1][k]) { s[from][k] = true; } } } ++it; } printf("%lld\n", suma); return 0; } |
English