Cod sursa(job #1053999)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 13 decembrie 2013 09:38:30
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 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];
unsigned int 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;
 
    hamilton [1][0] = 0;
 
    for (int i=1; i<nr-1; ++i)
    {
        for (int j=0; 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;
}