Cod sursa(job #1805106)

Utilizator LucianTLucian Trepteanu LucianT Data 13 noiembrie 2016 14:41:28
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
#define maxN 18
#define maxC 1<<18
#define INF (1<<30)
using namespace std;
vector<pair<int,int> >v[maxN];
int n,m,i,j,k,x,y,z,mask,sol=INF;
int dp[1<<maxN][maxN];
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;i++)
        scanf("%d %d %d",&x,&y,&z),
        v[y].push_back(make_pair(x,z));
    for(mask=0;mask<(1<<n);mask++)
        for(j=0;j<n;j++)
            dp[mask][j]=INF;
    dp[1][0]=0;
    for(mask=0;mask<(1<<n);mask++)
        for(i=0;i<n;i++)
        {
            if(mask&(1<<i)==0)
                continue;
            for(j=0;j<(int)v[i].size();j++)
            {
                if(mask&(1<<v[i][j].first)==0)
                    continue;
                dp[mask][i]=min(dp[mask][i],dp[mask^(1<<i)][v[i][j].first]+v[i][j].second);
            }
        }
    for(i=0;i<(int)v[0].size();i++)
        sol=min(sol,dp[(1<<n)-1][v[0][i].first]+v[0][i].second);
    if(sol==INF)
        printf("Nu exista solutie");
    else printf("%d",sol);
    return 0;
}