Cod sursa(job #2295389)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 3 decembrie 2018 17:08:33
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("hamilton.in");
ofstream out("hamilton.out");
vector<int> v[20];
int cost[20][20],a[(1<<18)+2][20];
int solve(int nr,int j)
{
    if(a[nr][j]||(nr==1&&j==0))
        return a[nr][j];
    a[nr][j]=1<<28;
    for(int i=0;i<v[j].size();i++)
        if((nr&(1<<v[j][i]))&&(v[j][i]||nr==(1<<j)+1))
            a[nr][j]=min(a[nr][j],solve(nr^(1<<j),v[j][i])+cost[v[j][i]][j]);
    return a[nr][j];
}
int main()
{
    int n,m,i,j,mn=1<<28,nr1,nr2;
    in>>n>>m;
    for(i=0;i<20;i++)
        for(j=0;j<20;j++)
            cost[i][j]=1<<28;
    for(i=0;i<m;i++)
    {
        in>>nr1>>nr2;
        in>>cost[nr1][nr2];
        v[nr2].push_back(nr1);
    }
    for(i=0;i<v[0].size();i++)
        mn=min(mn,solve((1<<n)-1,v[0][i])+cost[v[0][i]][0]);
    if(mn==1<<28)
        out<<"Nu exista solutie";
    else
        out<<mn;
    return 0;
}