Cod sursa(job #430182)

Utilizator DraStiKDragos Oprica DraStiK Data 30 martie 2010 20:10:48
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin ("bibel.in");
ofstream fout ("bibel.out");

#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define MAX 131075
#define sc second
#define fs first
#define DIM 20

vector <pair<int,int> > v,ant;
int best[MAX][DIM];
vector <int> cnt;
int n,m,t,rez;

inline void solve ()
{
    int i,j,k;

    n=v.size ();
    m=(1<<n);
    for (i=0; i<m; ++i)
		for (j=0; j<n; ++j)
            best[i][j]=INF;
	for (i=0; i<n; ++i)
		for (j=0; j<(int)ant.size (); ++j)
			best[1<<i][i]=min(best[1<<i][i],cnt[j]+(v[i].fs-ant[j].fs)*(v[i].fs-ant[j].fs)+(v[i].sc-ant[j].sc)*(v[i].sc-ant[j].sc));
	for (i=0; i<m; ++i)
		for (j=0; j<n; ++j)
			if (i&(1<<j))
                for(k=0; k<n; ++k)
                    if(i&(1<<k))
                        best[i][j]=min (best[i][j],best[i^(1<<j)][k]+(v[k].fs-v[j].fs)*(v[k].fs-v[j].fs)+(v[k].sc-v[j].sc)*(v[k].sc-v[j].sc));;
    rez=INF;
	ant.clear ();
	cnt.clear ();
	for (i=0; i<n; ++i)
	{
		rez=min (rez,best[(1<<n)-1][i]);
		ant.push_back(v[i]);
		cnt.push_back(best[(1<<n)-1][i]);
	}
	v.clear ();
	fout<<rez<<"\n";
}

int main ()
{
    int tip,x,y;

    ant.pb (mp (0,0));
    cnt.pb (0);
    for (fin>>tip; tip!=2; fin>>tip)
    {
        if (tip==1)
            solve ();
        else
        {
            fin>>x>>y;
            v.pb (mp (x,y));
        }
    }
    return 0;
}