Cod sursa(job #1553839)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 20 decembrie 2015 16:35:11
Problema Ciclu hamiltonian de cost minim Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#define maxv 1<<20
#define inf 0x3f3f3f3f
#include <algorithm>

using namespace std;

int N,M,a[18][18],c[18][maxv];

int part(int nod,int viz){
    if(c[nod][viz] == 0){
        c[nod][viz] = inf;
        if(viz == (1<<nod) + 1)
            c[nod][viz] = a[0][nod] ? a[0][nod] : inf;
        else
         for(int i = 0;i < N;++i)
            if(a[i][nod]>0 && ((viz>>i) & 1))
              c[nod][viz] = min(c[nod][viz],part(i,viz-(1<<nod))+a[i][nod]);
    }
    return c[nod][viz];
}

int main(){
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d %d ",&N,&M);
    int x,y,z;
    while(M--){
        scanf("%d %d %d ",&x,&y,&z);
        a[x][y] = z;
    }
    int rez = inf;
    for(x = 0;x < N;++x)
        if(a[x][0] > 0)rez = min(rez,a[x][0] + part(x,(1<<N)-1));
    if(rez == inf)printf("Nu exista solutie\n");
    else printf("%d\n",rez);
    return 0;
}