Cod sursa(job #1607098)

Utilizator T.C.11Tolan Cristian T.C.11 Data 20 februarie 2016 20:22:14
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>
#include <cstring>
#define INF 100000000
#define MAXN 20
#define MAXX 270000

using namespace std;

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

vector<int> v[MAXN];
int dinamica[MAXX][MAXN],n,m,i,j,x,y,c,Cost[MAXN][MAXN],sol;


int main()
{
    fin>>n>>m;
    for (i=0;i<(1<<n);++i)
        for (j=0;j<n;++j)
            dinamica[i][j]=INF;
    for (i=0;i<n;++i)
        for (j=0;j<n;++j)
            Cost[i][j]=INF;
    for (i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        v[y].push_back(x); /// in v[y] stocam toate nodurile care au muchie directa catre nodul y;
        Cost[x][y] = c;
    }
    dinamica[1][0] = 0;
    for (i=0;i<(1<<n);++i)
        for (j=0;j<n;++j)
            if (i&(1<<j))
                for (vector<int>::iterator k = v[j].begin(); k != v[j].end(); ++k)
                    if (i&(1<<(*k)))
                        dinamica[i][j] = min(dinamica[i][j], dinamica[i^(1<<j)][*k]+Cost[*k][j]);

    sol = INF;
    for (vector<int>::iterator k = v[0].begin(); k != v[0].end(); ++k)
        sol = min(sol, dinamica[(1<<n) - 1][*k] + Cost[*k][0]);
    if (sol == INF)
        fout<<"Nu exista solutie";
    else
        fout<<sol;
    return 0;
}