Cod sursa(job #1800830)

Utilizator binicBinica Nicolae binic Data 8 noiembrie 2016 10:16:16
Problema Ciclu hamiltonian de cost minim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>v[20];
int n,m,x,y,sol,C,c[300000][20],cost[20][20];
int dp(int st, int stare, int fin)
{
    if(c[stare][fin] == -1)
    {
        c[stare][fin]=20000000;
        int precstare=0,x=0;
        for(int i=0;i<v[fin].size();i++)
            if( stare & (1<<v[fin][i]) )
            {
                if(v[fin][i]==st && ( ( stare ^ (1<<fin))  != (1<<st))) continue;
                precstare=stare^(1<<fin);
                x=dp(st,precstare,v[fin][i])+cost[v[fin][i]][fin];
                if(x<c[stare][fin])c[stare][fin]=x;
            }
    }
    return c[stare][fin];
}
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cost[i][j]=20000000;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&C);
        cost[x][y]=C;
        v[y].push_back(x);
    }
    memset(c,-1,sizeof(c));
    for(int i=0;i<n;i++)
        c[1<<i][i]=0;
    sol=20000000;
    for(int i=0;i<v[0].size();i++)
    {
        x=dp(0,(1<<n)-1,v[0][i])+cost[v[0][i]][i];
        if(x<sol)sol=x;
    }
    if(sol!=20000000)printf("%d ",sol);
    else printf("Nu exista solutie");
    return 0;
}