Pagini recente » Cod sursa (job #657971) | Cod sursa (job #772235) | Cod sursa (job #2208014) | Cod sursa (job #921385) | Cod sursa (job #2451817)
#include <iostream>
#include <cstdio>
#include <vector>
#define NMAX 17
#define INF 1e9
using namespace std;
vector<pair <int, int> > bile;
int C[1 << NMAX][NMAX];
int Cost[NMAX][NMAX];
int dist(pair<int, int> p1, pair<int, int> p2){
return (p1.first - p2.first)*(p1.first - p2.first) + (p1.second - p2.second)*(p1.second - p2.second);
}
int main()
{
FILE *fin, *fout;
int o,x,y,i,j,k,sol,n;
fin = fopen("bibel.in","r");
fout = fopen("bibel.out","w");
fscanf(fin,"%d",&o);
bile.push_back(make_pair(0,0));
while(o != 2){
do{
if(o != 1){
fscanf(fin,"%d %d",&x,&y);
bile.push_back(make_pair(x,y));
}
fscanf(fin,"%d",&o);
}while(o != 1);
n = bile.size();
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
Cost[i][j] = Cost[j][i] = dist(bile[i],bile[j]);
for(i=0;i< (1<<n);i++)
for(j=0;j<n;j++)
C[i][j] = INF;
C[1][0] = 0;
for(i=0;i< (1<<n);i++)
for(j=0;j<n;j++)
if(i & (1<<j))
for(k=0;k<n;k++)
if(i & (1<<k))
C[i][j] = min(C[i][j], C[i ^ (1<<j)][k] + Cost[k][j]);
sol = INF;
for(j=0;j<n;j++)
sol = min(sol, C[(1<<n) - 1][j]);
fprintf(fout,"%d\n",sol);
fscanf(fin,"%d",&o);
}
fclose(fin);
fclose(fout);
return 0;
}