Cod sursa(job #1209566)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 18 iulie 2014 00:44:29
Problema Ciclu hamiltonian de cost minim Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#include <algorithm>
#define INF 1000000000

using namespace std;

int dp[(1<<20)][20],C[20][20];

int main()
{
    int M,a,b,c,i,j,k,N,sol=INF;
    freopen ("hamilton.in","r",stdin);
    freopen ("hamilton.out","w",stdout);
    scanf("%d%d", &N,&M);
    for(i=1;i<=N;++i)
        for(j=1;j<=N;++j)
            C[i][j]=INF;
    while(M--)
    {
        scanf("%d%d%d", &a,&b,&c);
        ++a; ++b;
        C[a][b]=c;
    }
    for(i=0;i<(1<<N);++i)
        for(j=1;j<=N;++j)
            dp[i][j]=INF;
    for(i=1;i<=N;++i)
        dp[(1<<(i-1))][i]=0;
    for(i=2;i<(1<<N);++i)
        for(j=1;j<=N;++j)
            if(((1<<(j-1))&i) && i-(1<<(j-1)))
                for(k=1;k<=N;++k)
                    if(k!=j && ((1<<(k-1))&i))
                        dp[i][j]=min(dp[i][j],dp[i-(1<<(j-1))][k]+C[k][j]);
    for(i=2;i<=N;++i)
        sol=min(sol,dp[(1<<N)-1][i]+C[i][1]);
    if(sol==INF)
        printf("Nu exista solutie\n");
    else
        printf("%d\n", sol);
    return 0;
}