Pagini recente » Cod sursa (job #1813770) | Cod sursa (job #1073060) | Cod sursa (job #1614814) | Cod sursa (job #2687261) | Cod sursa (job #1456567)
#include <utility>
#include <algorithm>
#include <fstream>
#include <cstring>
#define st first
#define nd second
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
const int INF = 0x3f3f3f3f;
int Path[1 << 17][17],N[2],T[17];
pair< int,int > B[2][17];
inline int Dst(pair< int,int > &A,pair< int,int > &B)
{
return (A.st - B.st) * (A.st - B.st) + (A.nd - B.nd) * (A.nd - B.nd);
}
inline int Count(int i)
{
int Nr = 0;
while(i)
Nr++,i &= i - 1;
return Nr;
}
int main()
{
int Op,lvl = 0;
N[1] = 1;
do
{
fin >> Op;
if (Op == 0)
{
N[lvl]++;
fin >> B[lvl][N[lvl]].st >> B[lvl][N[lvl]].nd;
}
else
if (Op == 1)
{
for (int i = 1;i <= N[lvl];i++)
{
Path[1 << (i - 1)][i] = INF;
for (int j = 1;j <= N[!lvl];j++)
Path[1 << (i - 1)][i] = min(Path[1 << (i - 1)][i],T[j] + Dst(B[lvl][i],B[!lvl][j]));
}
for (int i = 1;i < (1 << N[lvl]);i++)
if (Count(i) > 1)
for (int j = 1;j <= N[lvl];j++)
{
Path[i][j] = INF;
if (i & (1 << (j - 1)))
for (int k = 1;k <= N[lvl];k++)
if (j != k && (i & (1 << (k - 1))))
Path[i][j] = min(Path[i][j],Path[i ^ (1 << (j - 1))][k] + Dst(B[lvl][j],B[lvl][k]));
}
int Sol = INF;
for (int i = 1;i <= N[lvl];i++)
Sol = min(Sol,Path[(1 << N[lvl]) - 1][i]),
T[i] = Path[(1 << N[lvl]) - 1][i];
lvl ^= 1;
N[lvl] = 0;
fout << Sol << "\n";
}
}while(Op != 2);
return 0;
}