Cod sursa(job #2126928)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 10 februarie 2018 10:19:19
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

#define NMAX 20
#define INFINIT 0x3f3f3f3f

int n,m, dp[(1<<NMAX)][NMAX];
vector<int> g[NMAX];

int cost[(1<<NMAX)][NMAX];

typedef unsigned uint;

void citire()
{
    scanf("%d %d ",&n,&m);

    for (int i=0; i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            cost[i][j] = INFINIT;
        }
    }

    for(int i=0;i<m;i++)
    {
        int x,y,c;
        scanf("%d %d %d",&x,&y,&c);
        g[y].push_back(x);
        cost[x][y]=c;
    }
}

void dinamica()
{
    for(int i=0;i<(1<<n);i++)
    {
        for(int j=0;j<n;j++)
        {
            dp[i][j]=INFINIT;
        }
    }


    dp[1][0]=0;

    for(int i=0;i<(1<<n);i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i& (1<<j) )
            {
                for(vector<int>::iterator it=g[j].begin();it!=g[j].end();it++)
                {
                    if(i & (1<<*it))
                    {
                        dp[i][j]=min(dp[i][j], dp[i^(1<<j)][*it] + cost[*it][j]);
                    }
                }
            }
        }
    }

    int mincost = INFINIT;
    for(vector<int>::iterator it=g[0].begin();it!=g[0].end();it++)
    {
        mincost = min(mincost,dp[(1<<n)-1][*it] + cost[*it][0]);
    }
    if(mincost!=INFINIT)
        printf("%d\n",mincost);
    else printf("Nu exista solutie\n");
}
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    citire();
    dinamica();
    return 0;
}