Cod sursa(job #1817112)

Utilizator Emil64Emil Centiu Emil64 Data 27 noiembrie 2016 13:07:19
Problema Ciclu hamiltonian de cost minim Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 3.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#define oo (1<<30)

using namespace std;

vector <int> v[19];
int cost[19][19];
int d[1<<19][19];

int solve(int a, int cfg, int b)
{
    if (d[cfg][b] != oo)
        return d[cfg][b];

    for (int i=0; i<v[b].size(); i++)
        if (cfg & (1<<v[b][i]))
            if (!(v[b][i] == a && ((cfg ^ (1<<b)) != (1<<a))))
                d[cfg][b] = min(d[cfg][b], solve(a, cfg ^ (1<<b), v[b][i]) + cost[v[b][i]][b]);

    return d[cfg][b];
}

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

    int a, b, c, n, m, i, j, sol;

    f >> n >> m;

    for (i=0; i<n; i++)
        for(j=0; j<n; j++)
            cost[i][j] = oo;

    for (i=1; i<=m; i++){

        f >> a >> b >> c;
        v[b].push_back(a);
        cost[a][b] = c;
    }

    //for(i=0; i<n; i++)
        for(j=0; j<(1<<(n)); j++)
            for(int k=0; k<n; k++)
                d[j][k] = oo;
    sol = oo;
    d[1][0] = 0;
    for (j=0; j < v[0].size(); j++)
            sol = min(sol, solve(0, (1<<n)-1, v[0][j]) + cost[v[0][j]][0]);

    if(sol != oo)g << sol << "\n";
    else g << "Nu exista solutie\n";

}


/*int d[5][1<<5][8]={0};

struct arc{
    int destinatie, cost;
};

vector<arc>cost[307];

inline int solve(int a, int cfg, int b){

    if(d[a][cfg][b] != oo)
        return d[a][cfg][b];
    int min, ms, i, dest, _cost;
    ms = cfg ^ (1<<b);
    min = oo;
    for(i=0; i<cost[b].size(); i++){
        dest = cost[b][i].destinatie;
        if(cfg & (1<<dest) && dest != a){
            if(d[a][ms][dest] != oo)
                _cost = d[a][ms][dest];
            else
                _cost = solve(a, ms, dest);
            if(_cost != oo)
                _cost += cost[b][i].cost;
            if(_cost < min)
                min = _cost;
        }
    }
    d[a][cfg][b] = min;
    return min;
}

int main(){
    int i, j, n, a, b, c, m;
    ifstream f("hamilton.in");
    ofstream g("hamilton.out");
    f >> n >> m;
    arc _a;
    for(i=1; i<=m; i++){
        f >> a >> b >> c;
        _a.destinatie = a;
        _a.cost = c;
        cost[b].push_back(_a);
    }
    for(i=0; i<n; i++)
        for(j=0; j<=(1<<(n-1)); j++)
            for(int k=0; k<n; k++)
                d[i][j][k] = oo;
    for(i=0; i<n; i++){
        d[i][1<<i][i] = 0;
    }
    int sol = oo;
    for(i=0; i<n; i++){
        for (j = 0; j < cost[i].size(); ++j)
            if(solve(i, (1<<n)-1, cost[i][j].destinatie) + cost[i][j].cost < sol)
                sol = solve(i, (1<<n)-1, cost[i][j].destinatie) + cost[i][j].cost;
    }
    g << sol << "\n";
}


int d[5][1<<5][8]={0};

inline int solve(int a, int b, int cfg){

    if(d[a][cfg][b] < oo)
        return d[a][cfg][b];

    //cout << cfg << "\n";
    int ms, min, cost;
    min = oo;
    ms = cfg ^ (1<<b);
    for(int i=0; (1<<i)<=ms; i++)
        if(ms & (1<<i) && i!=a && d[i][(1<<i) + (1<<b)][b] !=oo){
            if(d[a][ms][i] < oo)
                cost = d[a][ms][i];
            else
                cost = solve(a, i, ms);
            cost += d[i][(1<<i) + (1<<b)][b];
            if(cost < min && cost>-1)
                min = cost;
        }
    cout << min << " " << oo <<"\n";
    d[a][cfg][b] = min;
    return min;
}

int main()
{
    ifstream f("hamilton.in");
    ofstream g("hamilton.out");
    int a, b, c, i, j, n, m, k;
    f >> n >> m;

    for(i=0; i<n; i++){
        for(j=0; j<(1<<n); j++)
            for(k=0; k<n; k++)
                d[i][j][k] = oo;
    }

    for(i=1; i<=m; i++){
        f >> a >> b >> c;
        //a--;
        //b--;
        d[a][(1<<a) + (1<<b)][b] = c;
    }
    for(i=0; i<n; i++)
        d[i][1<<i][i] = 0;
    g << solve(0, n-1, 0) << "\n";

}*/