Cod sursa(job #2451817)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 28 august 2019 12:29:09
Problema Bibel Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#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;
}