Cod sursa(job #1165585)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 2 aprilie 2014 19:24:37
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>
#include <cstring>
#define INF 0x3f3f3f3f

using namespace std;

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

int c[21][21], d[20][(1<<18)+1], stare_finala = 1, n, m;
vector<int> RV[21];

int nemo(int nod, int stare)
{
    if(d[nod][stare] != -1)
        return d[nod][stare];
    d[nod][stare] = INF;
    if(nod == 0)
    {
        if(stare == 0)
            return 0;
        return INF;
    }
    for(vector<int>::iterator it = RV[nod].begin(); it!= RV[nod].end(); it++)
        if( (1<<*it) & stare && c[*it][nod])
        {
            int r = nemo(*it,stare-(1<<nod)) + c[*it][nod];
            if(r < d[nod][stare])
                d[nod][stare] = r;
        }
    return d[nod][stare];
}


int main()
{
    fin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        fin>>c[x][y];
        RV[y].push_back(x);
    }

    memset(d,-1,sizeof(d));
    stare_finala = (1<<n) - 1;
    int sol = INF;
    d[0][1] = 0;
    for(vector<int>::iterator it = RV[0].begin(); it!= RV[0].end(); it++)
    {
        int r = nemo(*it, stare_finala) + c[*it][0];
        if(r < sol)
            sol = r;
    }
    if(sol == INF)
        fout<<"Nu exista solutie";
    else
        fout<<sol;

    fin.close();
    fout.close();
    return 0;
}