Cod sursa(job #976268)

Utilizator dan_tudorDan Tudor dan_tudor Data 22 iulie 2013 22:08:06
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <utility>
#include <string.h>

using namespace std;

ifstream cin("bibel.in");
ofstream cout("bibel.out");

const int MAXN = 20;
const int oo = (1<<31)-1;

int op, x, y, N, predN, D[MAXN], Ans, Cost[MAXN][MAXN], DP[1<<18][20], pred;
vector< pair<int, int> > V, Ant;
vector< int > Cant;

inline int Distance(pair<int, int> &a, pair<int, int> &b){
    return (a.first - b.first)*(a.first - b.first) + (a.second - b.second)*(a.second - b.second);
}

inline void Solve(){
    int N = V.size(),
    M = (1 << N);

    for(int i = 0 ; i < N ; ++ i)
        for(int j = 0 ; j < N ; ++ j)
            Cost[i][j] = Distance(V[i], V[j]);

    for(int i = 0 ; i < M ; ++ i)
        for(int j = 0 ; j < N ; ++ j)
            DP[i][j] = oo;

    for(int i = 0 ; i < N ; ++ i)
        for(int j = 0 ; j < Ant.size() ; ++ j)
            DP[(1 << i)][i] = min ( DP[(1 << i)][i], Cant[j] + Distance(V[i], Ant[j]));

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

    Ans = oo;
    Ant.clear();
    Cant.clear();
    for(int i = 0 ; i < N ; ++ i){
        Ans = min (Ans, DP[M-1][i]);
        Ant.push_back(V[i]);
        Cant.push_back(DP[M-1][i]);
    }
    V.clear();
    cout << Ans << "\n";
}

int main() {
    Ant.push_back(make_pair(0, 0));
    Cant.push_back(0);
    for(cin >> op ; op != 2 ; cin >> op){

        if(op)
            Solve();
        else {
            int X, Y;
            cin >> X >> Y;
            V.push_back(make_pair(X, Y));
        }
    }
    cin.close();
    cout.close();
    return 0;
}