Cod sursa(job #1219271)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 13 august 2014 20:31:46
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#include <vector>

#define Nmax ((1<<18)+666)
#define INF 0x3f3f3f3f

using namespace std;

vector<int> G[20];
int cost[20][20],N,M;
int DP[Nmax][20]; /// DP[i][j] -> costul minim de a ajunge in nodul i trecand prin maska j


void read ( void )
{
    scanf("%d%d",&N,&M);
    int a,b,c;
    for(int i = 1; i <= M; ++i){
        scanf("%d%d%d",&a,&b,&c);
        G[b].push_back(a);
        cost[a][b] = c;
    }
}


void prepare ( void )
{
    memset(DP,INF,sizeof(DP));
    DP[1][0] = 0;
}

void solve ( void )
{
   for(int mask = 0; mask < (1<<N); ++mask)
        for(int i = 0; i < N; ++i)
            if(mask & (1<<i))
                for(vector<int>::iterator it = G[i].begin();it!= G[i].end(); ++it)
                    if(mask & (1<<*it))
                        if(DP[mask][i] > DP[mask^(1<<i)][*it] + cost[*it][i])
                            DP[mask][i] = DP[mask^(1<<i)][*it] + cost[*it][i];
   int best = INF;
   for(vector<int>::iterator it = G[0].begin(); it != G[0].end(); ++it)
        best = min ( best, DP[(1<<N)-1][*it] + cost[*it][0]);
   if(best >= INF){
        printf("Nu exista solutie\n");
        return;
   }
   printf("%d\n", best);
}

int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);

    read();
    prepare();
    solve();

    return 0;
}