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);
}