Pagini recente » Cod sursa (job #455712) | Cod sursa (job #1458063) | Cod sursa (job #101087) | Cod sursa (job #144) | Cod sursa (job #370025)
Cod sursa(job #370025)
#include <fstream>
#include <cstring>
#define INF 2100000000
using namespace std;
ifstream fi("bibel.in");
ofstream fo("bibel.out");
int D[2][1<<17][17];
int N[2];
struct point{ int x,y; } v[2][18];
inline int dist(int x1,int y1,int x2,int y2){
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
inline int min(int x1,int x2){
return x1<x2?x1:x2;
}
inline int max(int x1,int x2){
return x1>x2?x1:x2;
}
int main(){
int x,ind=0;
fi>>x;
N[0]=0;
N[1]=1;
v[1][1].x=v[1][1].y=0;
D[1][1][0]=0;
do {
if (x==0){
++N[ind];
fi>>v[ind][N[ind]].x>>v[ind][N[ind]].y;
} else if (x==1){
for (int i=0;i<(1<<N[ind]);++i)
for (int j=0;j<=N[ind];++j) D[ind][i][j]=INF;
for (int i=1;i<=N[ind];++i)
for (int j=1;j<=N[1-ind];++j)
D[ind][1<<(i-1)][i-1]=min(D[ind][1<<(i-1)][i-1],D[1-ind][(1<<N[1-ind])-1][j-1]+dist(v[1-ind][j].x,v[1-ind][j].y,v[ind][i].x,v[ind][i].y));
for (int i=1;i<(1<<N[ind]);++i)
for (int j=1;j<=N[ind];++j) if (i & (1<<(j-1)))
for (int k=1;k<=N[ind];++k)
if ((i&(1<<(k-1)))==0 && D[ind][i | (1<<(k-1))][k-1]>D[ind][i][j-1]+dist(v[ind][j].x,v[ind][j].y,v[ind][k].x,v[ind][k].y))
D[ind][i | (1<<(k-1))][k-1]=D[ind][i][j-1]+dist(v[ind][j].x,v[ind][j].y,v[ind][k].x,v[ind][k].y);
int mini=D[ind][(1<<N[ind])-1][0];
for (int i=2;i<=N[ind];++i) mini=min(mini,D[ind][(1<<N[ind])-1][i-1]);
fo<<mini<<"\n";
ind=1-ind;
N[ind]=0;
}
if (x!=2) fi>>x;
} while (x!=2);
fi.close();
fo.close();
return 0;
}