Cod sursa(job #1870252)

Utilizator vancea.catalincatalin vancea.catalin Data 6 februarie 2017 15:23:44
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<iostream>
#include<fstream>
#include<vector>
#define DN ((1<<18)+20)
#define inf 1000000000
#define s second
#define f first
using namespace std;
fstream fin("hamilton.in",ios::in),fout("hamilton.out",ios::out);
int bst[DN][20],n,m,N;
vector<pair<int,int> > v[20];
int main()
{
    int i,j,k,a,b,c,bit,vecin,val,r=inf;
    fin>>n>>m; N=(1<<n);
    for(i=1;i<=m;i++){
        fin>>a>>b>>c; v[a].push_back({b,c});
    }
    for(i=0;i<=N;i++) for(j=0;j<n;j++) bst[i][j]=inf;
    bst[1][0]=0;
    for(i=1;i<N;i++)
    {
        for(j=0;j<n;j++)
        {
            bit=(1<<j);if((i&bit)==0) continue;//j-ul trebuie sa faca parte din i
            for(k=0;k<v[j].size();k++)
            {
                vecin=v[j][k].f;
                val=v[j][k].s;
                bit=(1<<vecin);
                //vecinul sa nu fie bagat in configuratie deja
                if((i&bit)==0) bst[i+bit][vecin]=min(bst[i+bit][vecin],bst[i][j]+val);
            }
        }
    }
    for(i=1;i<n;i++)
    {
        for(j=0;j<v[i].size();j++)
        {
            vecin=v[i][j].f;
            val=v[i][j].s;
            if(vecin==0)
            {
                r=min(r,bst[N-1][i]+val);
            }
        }
    }
    if(n==1){
        fout<<"0\n";
        return 0;
    }
    if(r==inf)
    {
        fout<<"Nu exista solutie\n";
        return 0;
    }
    fout<<r;
}