Cod sursa(job #954774)

Utilizator misinozzz zzz misino Data 29 mai 2013 23:53:35
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#define INF 999999999
#define punct pair<int,int>
#define x first
#define y second
using namespace std;
ifstream f("bibel.in");
ofstream g("bibel.out");
int op,n,rez,pred,i,j,conf,d[20],c[20][20],sol[1<<18][20];
punct p[20],pt[20];
inline int dist(punct a,punct b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int main()
{
    pred=1;
    while(1)
    {
        f>>op;
        if(op==2)
        return 0;
        else
        if(op==0)
        f>>p[n].x>>p[n].y,++n;
        else
        {
            for(i=0;i<n;++i)
            for(j=0;j<n;++j)
            c[i][j]=dist(p[i],p[j]);
            for(conf=0;conf<(1<<n);++conf)
            for(i=0;i<n;++i)
            sol[conf][i]=INF;
            for(i=0;i<pred;++i)
            for(j=0;j<n;++j)
            sol[1<<j][j]=min(sol[1<<j][j],d[i]+dist(pt[i],p[j]));
            for(conf=0;conf<(1<<n);++conf)
            for(i=0;i<n;++i)
            if(conf&(1<<i))
            for(j=0;j<n;++j)
            if(!(conf&(1<<j))&&sol[conf+(1<<j)][j]>sol[conf][i]+c[i][j])
            sol[conf+(1<<j)][j]=sol[conf][i]+c[i][j];
            rez=INF;
            for(i=0;i<n;++i)
            {
                d[i]=sol[(1<<n)-1][i];
                rez=min(rez,d[i]);
                pt[i]=p[i];
            }
            g<<rez<<'\n';
            pred=n;
            n=0;
        }
    }
}