Pagini recente » Cod sursa (job #643910) | Cod sursa (job #1196911) | Cod sursa (job #3123778) | Cod sursa (job #882901) | Cod sursa (job #921139)
Cod sursa(job #921139)
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
const int MAX_N = 19;
const int INF = 0x3f3f3f3f;
const int MAX_C = (1 << 19) + 2;
int N, t, Nr = 1;
int Cost[MAX_N][MAX_N], A[MAX_N][2], B[MAX_C][MAX_N], last[MAX_N][3];
vector < int > v[MAX_N];
int main()
{
ifstream f("bibel.in");
ofstream g("bibel.out");
memset(Cost, INF, sizeof(Cost));
memset(B, INF, sizeof(B));
while(t != 2)
{
f >> t;
if(!t)
++N, f >> A[N][0] >> A[N][1];
else if(t == 1)
{
int Sum = INF;
++N;
for(int q = 1; q <= Nr; ++q)
{
A[0][0] = last[q][0], A[0][1] = last[q][1];
for(int i = 0; i < N; ++i)
for(int j = 0; j < N; ++j)
if(i != j)
{
Cost[i][j] = Cost[j][i] = (A[i][0] - A[j][0]) * (A[i][0] - A[j][0]) + (A[i][1] - A[j][1]) * (A[i][1] - A[j][1]);
v[i].push_back(j);
v[j].push_back(i);
}
B[1][0] = 0;
for(int i = 1; i < (1 << N); ++i)
for(int j = 0; j < N; ++j)
if(i & (1 << j))
{
for(int k = 0; k < v[j].size(); ++k)
if(i & (1 << v[j][k]))
B[i][j] = min(B[i][j], B[i ^ (1 << j)][ v[j][k] ] + Cost[ v[j][k] ][j]);
}
int Min = INF;
for(int i = 1; i < N; ++i)
Min = min(Min, B[(1 << N) - 1][i]);
if(Min + last[q][2] < Sum)
Sum = Min + last[q][2];
}
Nr = N;
for(int i = 1; i <= Nr; ++i)
last[i][0] = A[i][0], last[i][1] = A[i][1], last[i][2] = B[(1 << N) - 1][i];
N = 0;
memset(Cost, INF, sizeof(Cost));
memset(B, INF, sizeof(B));
for(int i = 0; i < N; ++i)
v[i].clear();
g << Sum << '\n';
}
}
f.close();
g.close();
return 0;
}