Pagini recente » Cod sursa (job #1411272) | Cod sursa (job #2727618) | Cod sursa (job #425858) | Cod sursa (job #2254850) | Cod sursa (job #2378833)
#include <iostream>
#include <fstream>
#include <vector>
#define f first
#define s second
using namespace std;
ifstream fin("bibel.in");
ofstream fout("bibel.out");
vector <pair<int,int> > pct[210];
pair <int,int> p[210];
int L,l,dist[210][210],nrrez,baza;
long long d[131100][20],rez[20];
int main()
{
int a,b,c,niv,i,j,k,aux;
long long pinf,minn;
pinf=(long long)(1<<30)*(1<<30);
L=1;
l=0;
p[0].f=0;
p[0].s=0;
pct[0].push_back(make_pair(a,b));
while(fin>>c)
{
if(c==0)
{
fin>>a>>b;
pct[L].push_back(make_pair(a,b));
l++;
p[l].f=a;
p[l].s=b;
}
else
{
L++;
}
}
L=L-2;
for(i=0; i<=l; i++)
{
for(j=i+1; j<=l; j++)
{
dist[i][j]=(p[i].f-p[j].f)*(p[i].f-p[j].f)+(p[i].s-p[j].s)*(p[i].s-p[j].s);
dist[j][i]=dist[i][j];
}
}
nrrez=1;
rez[0]=0;
baza=1;
for(niv=1; niv<=L; niv++)
{
for(i=1; i<=(1<<pct[niv].size())-1; i++)
{
for(j=0; j<pct[niv].size(); j++)
{
d[i][j]=pinf;
if((i&(1<<j))==(1<<j))
{
aux=i-(1<<j);
if(aux==0)
{
for(k=0; k<nrrez; k++)
{
d[i][j]=min(d[i][j],rez[k]+dist[k+baza-nrrez][j+baza]);
}
}
else
{
for(k=0; k<pct[niv].size(); k++)
{
if(((aux&(1<<k))==(1<<k)))
{
d[i][j]=min(d[i][j],d[aux][k]+dist[k+baza][j+baza]);
}
}
}
}
}
}
minn=pinf;
i=(1<<pct[niv].size())-1;
for(j=0; j<pct[niv].size(); j++)
{
rez[j]=d[i][j];
minn=min(minn,d[i][j]);
}
fout<<minn<<'\n';
baza=baza+pct[niv].size();
nrrez=pct[niv].size();
}
}