Cod sursa(job #1969422)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 18 aprilie 2017 14:16:56
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
const int inf=0x3f3f3f3f;
int cost[20][20],C[260000][20];
vector<int>A[20];
int calc(int start,int conf,int last)
{
    if(C[conf][last]==-1)
    {
        C[conf][last]=inf;
        for(unsigned j=0;j<A[last].size();j++)
        {
            if(conf&(1<<A[last][j]))
            {
                if(A[last][j]==start && ((conf^(1<<last))!=(1<<start))) continue;
                C[conf][last]=min(C[conf][last],calc(start,conf^(1<<last),A[last][j])+cost[A[last][j]][last]);
            }
        }
    }
    return C[conf][last];
}
int main()
{
    int n,m,a,b;
    fin>>n>>m;
    memset(cost,inf,sizeof(cost));
    while(m--)
    {
        fin>>a>>b;
        fin>>cost[a][b];
        A[b].push_back(a);
    }
    int sol=inf;
    for(int i=0;i<n;i++)
    {
        memset(C,-1,sizeof(C));
        C[1<<i][i]=0;
        for(unsigned j=0;j<A[i].size();j++)
        {
            sol=min(sol,calc(i,(1<<n)-1,A[i][j])+cost[A[i][j]][i]);
        }
    }
    if(sol==inf) fout<<"Nu exista solutie";
    else fout<<sol;
}