#include<cstdio> #include<queue> #include<algorithm> using namespace std; int ceny[2001][2001]; pair<int, pair<int, int> > pyt[2100002]; int gotowe[2002][2002]; bool czy[2002][2002]; int ilew[2002]; int main(){ int n,ile=0, licz=0; scanf("%d", &n); for(int i=1; i<=n; i++) for(int j=i; j<=n; j++){ scanf("%d", &ceny[i][j]); pyt[ile]=make_pair(ceny[i][j], make_pair(i,j)); ile++; } sort(pyt, pyt+ile); long long wyn=0; ile=0; int j=0, dobre=0; for(int i=1; i<=n+1; i++){ ilew[i]=1; gotowe[i][1]=i; } while(dobre<n*(n+1)/2 && j<n*(n+1)/2){ int x=pyt[j].second.first; int y=pyt[j].second.second; if(czy[x][y+1]==0){ wyn+=(long long)(ceny[x][y]); y++; czy[x][y]=1; dobre++; vector<pair<int, int> > nowe; nowe.push_back(make_pair(x,y)); //printf("%d %d\n", x, y); for(int i=1; i<=ilew[x]; i++) for(int l=1; l<=ilew[y]; l++) if(i!=1 || l!=1) { int x1=gotowe[x][i]; int y1=gotowe[y][l]; if(x1>y1) swap(x1,y1); // printf("%d %d\n", x1, y1); if(czy[x1][y1]==0){ czy[x1][y1]=1; nowe.push_back(make_pair(x1,y1)); dobre++; } else return -1; } for(int i=0; i<int(nowe.size()); i++){ ilew[nowe[i].first]++; gotowe[nowe[i].first][ilew[nowe[i].first]]=nowe[i].second; ilew[nowe[i].second]++; gotowe[nowe[i].second][ilew[nowe[i].second]]=nowe[i].first; } nowe.clear(); } j++; } printf("%lld", wyn); if(licz>0) printf("%d", licz); }
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 | #include<cstdio> #include<queue> #include<algorithm> using namespace std; int ceny[2001][2001]; pair<int, pair<int, int> > pyt[2100002]; int gotowe[2002][2002]; bool czy[2002][2002]; int ilew[2002]; int main(){ int n,ile=0, licz=0; scanf("%d", &n); for(int i=1; i<=n; i++) for(int j=i; j<=n; j++){ scanf("%d", &ceny[i][j]); pyt[ile]=make_pair(ceny[i][j], make_pair(i,j)); ile++; } sort(pyt, pyt+ile); long long wyn=0; ile=0; int j=0, dobre=0; for(int i=1; i<=n+1; i++){ ilew[i]=1; gotowe[i][1]=i; } while(dobre<n*(n+1)/2 && j<n*(n+1)/2){ int x=pyt[j].second.first; int y=pyt[j].second.second; if(czy[x][y+1]==0){ wyn+=(long long)(ceny[x][y]); y++; czy[x][y]=1; dobre++; vector<pair<int, int> > nowe; nowe.push_back(make_pair(x,y)); //printf("%d %d\n", x, y); for(int i=1; i<=ilew[x]; i++) for(int l=1; l<=ilew[y]; l++) if(i!=1 || l!=1) { int x1=gotowe[x][i]; int y1=gotowe[y][l]; if(x1>y1) swap(x1,y1); // printf("%d %d\n", x1, y1); if(czy[x1][y1]==0){ czy[x1][y1]=1; nowe.push_back(make_pair(x1,y1)); dobre++; } else return -1; } for(int i=0; i<int(nowe.size()); i++){ ilew[nowe[i].first]++; gotowe[nowe[i].first][ilew[nowe[i].first]]=nowe[i].second; ilew[nowe[i].second]++; gotowe[nowe[i].second][ilew[nowe[i].second]]=nowe[i].first; } nowe.clear(); } j++; } printf("%lld", wyn); if(licz>0) printf("%d", licz); } |