#include <vector> #include <algorithm> #include <cstdio> using namespace std; #define ref & #define st first #define nd second #define mp make_pair #define pb push_back #define poka(x) cerr << #x << " = " << x << endl; typedef pair<int,int> pii; //////////////////////////////////////////////////////////////////////////////// typedef pair<int,pair<int,int> > prz; const int mx = 2000 + 9; bool se[mx][mx]; int main(){ int n; scanf("%d", &n); vector<prz> v; v.reserve(n*(n+1)/2 + 9); for(int i = 1; i <= n; ++i){ for(int k = i; k <= n; ++k){ int w; scanf("%d", &w); v.pb(mp(w,mp(i,k))); } } sort(v.begin(), v.end()); vector<vector<int> > kon(n+9); for(int i = 0; i < kon.size(); ++i){ kon[i].reserve(n+9); kon[i].pb(i); } long long wyn = 0; for(int j = 0; j < v.size(); ++j){ const int w = v[j].st, a = v[j].nd.st - 1, b = v[j].nd.nd; if(se[a][b]) continue; wyn += w; vector<pii> dodac; for(int i = 0; i < kon[a].size(); ++i) for(int k = 0; k < kon[b].size(); ++k) dodac.pb(pii(min(kon[a][i],kon[b][k]),max(kon[a][i],kon[b][k]))); for(int i = 0; i < dodac.size(); ++i){ const int x = dodac[i].st, y = dodac[i].nd; se[x][y] = se[y][x] = 1; kon[x].pb(y); kon[y].pb(x); } } printf("%lld\n", wyn); 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 | #include <vector> #include <algorithm> #include <cstdio> using namespace std; #define ref & #define st first #define nd second #define mp make_pair #define pb push_back #define poka(x) cerr << #x << " = " << x << endl; typedef pair<int,int> pii; //////////////////////////////////////////////////////////////////////////////// typedef pair<int,pair<int,int> > prz; const int mx = 2000 + 9; bool se[mx][mx]; int main(){ int n; scanf("%d", &n); vector<prz> v; v.reserve(n*(n+1)/2 + 9); for(int i = 1; i <= n; ++i){ for(int k = i; k <= n; ++k){ int w; scanf("%d", &w); v.pb(mp(w,mp(i,k))); } } sort(v.begin(), v.end()); vector<vector<int> > kon(n+9); for(int i = 0; i < kon.size(); ++i){ kon[i].reserve(n+9); kon[i].pb(i); } long long wyn = 0; for(int j = 0; j < v.size(); ++j){ const int w = v[j].st, a = v[j].nd.st - 1, b = v[j].nd.nd; if(se[a][b]) continue; wyn += w; vector<pii> dodac; for(int i = 0; i < kon[a].size(); ++i) for(int k = 0; k < kon[b].size(); ++k) dodac.pb(pii(min(kon[a][i],kon[b][k]),max(kon[a][i],kon[b][k]))); for(int i = 0; i < dodac.size(); ++i){ const int x = dodac[i].st, y = dodac[i].nd; se[x][y] = se[y][x] = 1; kon[x].pb(y); kon[y].pb(x); } } printf("%lld\n", wyn); return 0; } |