Cod sursa(job #1367641)

Utilizator AeroHHorea Stefan AeroH Data 1 martie 2015 23:51:06
Problema Bibel Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstring>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <iomanip>
#include <cmath>
#define inf 123456789
#define x first
#define y second
using namespace std;

ifstream f("bibel.in");
ofstream g("bibel.out");

int dp[(1<<17)+5][18],N1=1,N2,q,x,y,T,ct,best[20],i,j,k;

vector<pair<int,int> > v(20);

int dist(pair<int,int> a,pair<int,int> b)
    {
        return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }

void solve()
    {
        memset(dp,inf,sizeof(dp));

        for (i=0;i<N1;++i)
        {
            dp[(1<<N1)-1][i]=best[i];
        }

        for(i=1;i<1<<N2;++i)
            for(j=0;j<N2;++j)
                if (i & (1<<j))
                    for (k=0;k<N2;++k)
                        if (i & (1<<k))
                            {
                                dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k] + dist(v[k],v[j]));
                            }
        int rasp=inf;
        for (i=1;i<N2;++i)
        {
            if (dp[(1<<N2)-1][i]<rasp)
                rasp=dp[(1<<N2)-1][i];
            best[i]=dp[(1<<N2)-1][i];
        }
        g<<rasp<<'\n';


    }


int main()
{
    v[N2++]=make_pair(x,y);
    while(1)
    {
        f>>q;
        while(q == 0)
        {
            f>>x>>y>>q;
            v[N2++]=make_pair(x,y);
        }
        if (q == 1)
        {
            solve();
            N1=N2;
        }
        if (q == 2)
            break;
    }

    return 0;
}