Cod sursa(job #1232788)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 23 septembrie 2014 21:34:40
Problema Ciclu hamiltonian de cost minim Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <algorithm>
using namespace std;
int n,m,x,y,c,C[18][18],sol[18][1<<18],i,N,mask,j,ans,Mask;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int main()
{
    //freopen("hamilton.in","r",stdin);
    //freopen("hamilton.out","w",stdout);
    //scanf("%d%d",&n,&m);
    fin>>n>>m;
    for(;m;m--)
    {
        //scanf("%d%d%d",&x,&y,&c);
        fin>>x>>y>>c;
        C[x][y]=c;
    }
    for(i=0;i<n-1;i++)
        sol[i][(1<<i)]=C[n-1][i];
    N=(1<<(n-1))-1;
    for(mask=1;mask<=N;mask++)
        for(i=0;i<n-1;i++)
        {
            if(sol[i][mask])
            {
                for(j=0;j<n-1;j++)
                {
                    if(!(mask&(1<<j))&&C[i][j])
                    {
                        Mask=mask|(1<<j);
                        if(sol[j][Mask])
                            sol[j][Mask]=min(sol[j][Mask],C[i][j]+sol[i][mask]);
                        else
                            sol[j][Mask]=C[i][j]+sol[i][mask];
                    }
                }
            }
        }
    ans=18000010;
    for(i=0;i<n-1;i++)
        if(sol[i][N]&&C[i][n-1])
            ans=min(ans,(sol[i][N]+C[i][n-1]));
    if(ans==18000010)
        fout<<"Nu exista solutie\n";
    else
        fout<<ans;
    return 0;
}