Cod sursa(job #1910641)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 7 martie 2017 17:45:21
Problema Ciclu hamiltonian de cost minim Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

const int N=18, Inf=1000000000;
int d[18][(1<<18)],v[N];
struct ii{
    int nod,cost;
};
vector <ii> G[N];

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

    int n,m,l,i,j,a,b,c,k,x;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        G[a].push_back({b,c});
        //G[b].push_back({a,c});
    }

    k=(1<<n);
    for(j=0;j<k;j++)
        for(i=0;i<n;i++) d[i][j]=Inf;

    d[0][1]=0;
    for(i=0;i<G[0].size();i++){
        x=G[0][i].nod;
        c=G[0][i].cost;
        d[x][1+(1<<x)]=c;
    }

    for(j=1;j<k;j++){
        for(i=0;i<n;i++){
            if(j&(1<<i)){
                for(l=0;l<G[i].size();l++){
                    x=G[i][l].nod;
                    if(j&(1<<x)){
                        d[i][j]=min(d[i][j], d[x][j^(1<<i)]+G[i][l].cost);
                    }
                }
            }
        }
    }

    int Min=Inf;
    for(i=0;i<G[0].size();i++){
        x=G[0][i].nod;
        c=G[0][i].cost;
        Min=min(Min,d[x][k-1]+c);
    }
    if(Min==Inf) printf("Nu exista solutie\n");
    else printf("%d\n",Min);




    return 0;
}