Cod sursa(job #1556526)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 25 decembrie 2015 09:31:54
Problema Ciclu hamiltonian de cost minim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <vector>
#define maxx 1<<18
#define inf 0x3f3f3f3f
#include <cstring>
#include <algorithm>

using namespace std;

int N,M;
int C[maxx][19],cost[18][18];
vector <int> G[maxx];

int calc(int conf,int last){
    for(int i = 0;i < G[last].size();++i)
        if(conf & (1<<G[last][i])){
           if(G[last][i] != 0 || conf == (1<<last)+1)
            C[conf][last] = min(C[conf][last],calc(conf ^ (1<<last),G[last][i]) + cost[G[last][i]][last]);
          }
    return C[conf][last];
}

int main(){
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d %d ",&N,&M);

    memset(cost,inf,sizeof(cost));

    while(M--){
        int x,y,z;
        scanf("%d %d %d ",&x,&y,&z);
        G[y].push_back(x);
        cost[x][y] = z;
    }

    int S = inf;
    memset(C,inf,sizeof(C));
    C[1][0] = 0;

    for(int i=0;i < G[0].size();++i)
        S = min(S,calc((1<<N)-1,G[0][i]) + cost[G[0][i]][0]);

     if(S != inf)printf("%d\n",S);
     else printf("Nu exista solutie\n");
    return 0;
}