Cod sursa(job #980675)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 5 august 2013 14:07:32
Problema Bibel Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstring>

#include <fstream>
#include <vector>
using namespace std;

const int MAX_N = 17;
const int INF = 0x3f;
const int MAX_C = (1 << MAX_N) + 2;

int N, t,  Nr = 1;
int Cost[MAX_N][MAX_N], A[MAX_N][2], B[MAX_C][MAX_N], Min[MAX_N], last[MAX_N][3];

inline int dist(int x1, int x2, int y1, int y2)
{
    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}

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

    memset(Cost, INF, sizeof(Cost));
    while(t != 2)
    {
        f >> t;
        if(!t)
            f >> A[N][0] >> A[N][1], ++N;
        else if(t == 1)
        {
             int Sum = INF;
             for(int i = 0; i < N; ++i)
                for(int j = 0; j < N; ++j)
                        Cost[i][j] = Cost[j][i] = dist(A[i][0], A[j][0], A[i][1], A[j][1]);


             for(int i = 0; i < MAX_C; ++i)
                for(int j = 0; j < MAX_N; ++j)
                    B[i][j] = INF;
             for(int i = 0; i < N; ++i)
                for(int j = 0; j < Nr; ++j)
                    B[1 << i][i] = min(B[1 << i][i], Min[j] + dist(last[j][0], A[i][0], last[j][1], A[i][1]));


             for(int i = 1; i < (1 << N); ++i)
                for(int j = 0; j < N; ++j)
                    if(i & (1 << j))
                    {
                        for(int k = 0; k < N; ++k)
                            if(i & (1 << k))
                                B[i][j] = min(B[i][j], B[i ^ (1 << j)][k] + Cost[k][j]);
                    }

            int Tmp = INF;
            for(int i = 0; i < N; ++i)
                    Tmp = min(Tmp, B[(1 << N) - 1][i]);
            if(Tmp  < Sum)
                Sum = Tmp;
            for(int i = 0; i < N; ++i)
                    Min[i] = B[(1 << N) - 1][i];

            memset(Cost, INF, sizeof(Cost));
            Nr = N;
            for(int i = 0; i < Nr; ++i)
                last[i][0] = A[i][0], last[i][1] = A[i][1];
            N = 0;

            g << Sum << '\n';
        }
    }

    f.close();
    g.close();

    return 0;
}