Cod sursa(job #1912826)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 8 martie 2017 10:51:49
Problema Ciclu hamiltonian de cost minim Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

int n,m;
int d[262144][18];
vector< pair<int,int> > vec[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]==17000001)
    {
        for(vector< pair<int,int> >::iterator it=vec[y].begin();it!=vec[y].end();it++)
        {
            if(x&(1<<((*it).first)))
            {
                //printf("** %d %d",(*it).first,(1<<y)+1);
                if(((*it).first!=0)||(x==((1<<y)+1)))
                {
                    //printf("*** %d\n",solve(x^(1<<y),(*it).first)+(*it).second);
                    d[x][y]=min(d[x][y],solve(x^(1<<y),(*it).first)+(*it).second);
                    //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(make_pair(x,c));
    }

    int lim=1<<n;
    for(int j=0;j<n;j++)
    {
        for(int i=0;i<lim;i++)
        {
            d[i][j]=17000001;
        }
    }
    d[1][0]=0;

    int to=(1<<n)-1;
    int res=17000001;
    for(vector< pair<int,int> >::iterator it=vec[0].begin();it!=vec[0].end();it++)
    {
        res=min(res, solve((1<<n)-1,(*it).first)+(*it).second);
    }
    /*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);
    }
}