Cod sursa(job #1913420)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 8 martie 2017 12:50:18
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>

using namespace std;

int n,m;
int d[262144][18];
vector<int> vec[18];
vector<int> cost[18];

int solve(int x,int y)
{
    /*for(int i=262144;i>0;i>>=1)
    {
        if(i&x)
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }
    printf(" = %d %d\n",x,y);*/
    if(d[x][y]==-1)
    {
        d[x][y]=17000001;
        for(size_t i=0;i<vec[y].size();i++)
        {
            if(x&(1<<(vec[y][i])))
            {
                //printf("** %d %d",vec[y][i].first,(1<<y)+1);
                if((vec[y][i]!=0)||(x==((1<<y)+1)))
                {
                    //printf("*** %d\n",solve(x^(1<<y),vec[y][i].first)+vec[y][i].second);
                    d[x][y]=min(d[x][y],solve(x^(1<<y),vec[y][i])+cost[y][i]);
                    //printf("-> %d\n",y);
                }
            }
        }
    }
    return d[x][y];
}

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


    scanf("%d %d",&n,&m);
    /*for(int i=0;i<18;i++)
    {
        for(int j=0;j<18;j++)
        {
            adj[i][j]=1000001;
        }
    }*/
    int x,y,c;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&c);
        vec[y].push_back(x);
        cost[y].push_back(c);
    }

    int lim=1<<n;
    /*for(int j=0;j<n;j++)
    {
        for(int i=0;i<lim;i++)
        {
            d[i][j]=17000001;
        }
    }*/
    memset(d, -1, sizeof(d));
    d[1][0]=0;

    int to=(1<<n)-1;
    int res=17000001;
    for(size_t i=0;i<vec[0].size();i++)
    {
        res=min(res, solve((1<<n)-1,vec[0][i])+cost[0][i]);
    }
    /*for(int j=0;j<n;j++)
    {
        for(int i=0;i<(1<<n);i++)
        {
            printf("%d ",d[i][j]);
        }
        printf("\n");
    }*/
    if(res==17000001)
    {
        printf("Nu exista solutie");
    }
    else
    {
         printf("%d",res);
    }
}