Pagini recente » Cod sursa (job #383511) | Cod sursa (job #1911893) | Cod sursa (job #1838857) | Cod sursa (job #2974852) | Cod sursa (job #525755)
Cod sursa(job #525755)
#include <fstream>
using namespace std;
typedef long long int lli;
lli const maxc=10*1000,maxn=18,inf=maxn*(2*(maxc*maxc)+1);
struct hamiltonian_path
{
lli m;
lli SX[maxn],SY[maxn],V[maxn];
lli n;
lli X[maxn],Y[maxn];
lli W[maxn][maxn];
lli D[1<<maxn][maxn];
int get_minimum_weight()
{ lli x,t,s,b,y,bx,v,dx,dy,dd;
for(s=0;n>s;++s){D[0][s]=inf;}
for(s=0;n>s;++s)
{ for(t=0;m>t;++t)
{ dx=(SX[t]-X[s]);dx*=dx;
dy=(SY[t]-Y[s]);dy*=dy;
dd=dx+dy+V[t];
if(D[0][s]>dd){D[0][s]=dd;}
}
}
for(s=0;n>s;++s)
{ for(t=s;n>t;++t)
{ dx=(X[s]-X[t]);dx*=dx;
dy=(Y[s]-Y[t]);dy*=dy;
dd=dx+dy;
W[s][t]=W[t][s]=dd;
}
}
t=(1<<n)-1;
for(s=1;t>=s;++s)
{ for(y=0;n>y;++y)
{ b=inf;
for(x=0;n>x;++x)
{ bx=(1<<x);
if(0!=(s&bx))
{ v=D[s^bx][x]+W[x][y];
if(b>v){b=v;}
}
}
D[s][y]=b;
}
}
b=inf;
for(y=1;n>y;++y)
{ if(b>D[t][y]){b=D[t][y];} }
m=n;
for(s=0;m>s;++s)
{ SX[s]=X[s];
SY[s]=Y[s];
V[s]=D[t][s];
}
return b;
}
};
hamiltonian_path H;
int main()
{ ifstream is("bibel.in");
ofstream os("bibel.out");
lli op,a,n=0;
H.SX[0]=H.SY[0]=H.V[0]=0;H.m=1;
do
{ is>>op;
switch(op)
{ case 0:
is>>H.X[n]>>H.Y[n];++n;
break;
case 1:
H.n=n;a=H.get_minimum_weight();
os<<a<<endl;n=0;
break;
}
} while(2!=op);
return 0;
}