Cod sursa(job #990232)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 27 august 2013 18:38:27
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
#include <utility>

#define inf 1<<30
#define x first
#define y second
#define vint vector<int>::iterator

using namespace std;

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

vector <int> G[20];
long long hamilton[1<<18][18],m[18][18],minv,n,M,a,b,c,nr;

int main()
{
    fin>>n>>M;

    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j) m[i][j]=inf;

    for (int i=1; i<=M; ++i)
    {
        fin>>a>>b>>c;
        G[a].push_back(b);
        m[a][b]=c;
    }

    nr = (1<<n);
    for (int i=0; i<nr; ++i)
        for (int j=0; j<n; ++j) hamilton[i][j] = inf;

    for (vint it=G[0].begin(); it!=G[0].end(); ++it) hamilton[1+(1<<*it)][*it] = m[0][*it];

    for (int i=1; i<nr-1; ++i)
    {
        for (int j=1; j<n; ++j)
        {
            if (hamilton[i][j]!=inf)
            {
                for (vint it = G[j].begin(); it != G[j].end(); ++it)
                {
                   if ((i | (1<<*it))!=i) hamilton [i | (1<<*it)][*it] = min (hamilton[i | (1<<*it)][*it],hamilton [i][j] + m[j][*it]);
                }
            }
        }
    }

    minv = inf;
    for (int i=1; i<n; ++i)
    {
        minv = min (minv,hamilton[nr-1][i]+m[i][0]);
    }

    if (minv==inf) fout<<"Nu exista solutie";
    else fout<<minv;
}