Cod sursa(job #429887)

Utilizator DraStiKDragos Oprica DraStiK Data 30 martie 2010 16:22:04
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <algorithm>
#include <vector>
using namespace std;

#define INF 0x3f3f3f3f
#define pb push_back
#define MAX 262150
#define DIM 20

int best[MAX][DIM],cost[DIM][DIM];
vector <int> g[DIM];
int n,m,cst;

void read ()
{
    int i,x,y;

    memset (cost,INF,sizeof (cost));
    scanf ("%d%d",&n,&m);
    for (i=1; i<=m; ++i)
    {
        scanf ("%d%d",&x,&y);
        g[y].pb (x);
        scanf ("%d",&cost[x][y]);
    }
}

void solve ()
{
    vector <int> :: iterator it;
    int i,j;

    memset (best,INF,sizeof (best));
    best[1][0]=0;
    for (i=0; i<(1<<n); ++i)
        for (j=0; j<n; ++j)
            if (i&(1<<j))
                for (it=g[j].begin (); it!=g[j].end (); ++it)
                    if (i&(1<<*it))
                        best[i][j]=min (best[i][j],best[i^(1<<j)][*it]+cost[*it][j]);
    cst=INF;
    for (it=g[0].begin (); it!=g[0].end (); ++it)
        cst=min (cst,best[(1<<n)-1][*it]+cost[*it][0]);
    if (cst==INF)
        printf ("Nu exista solutie");
    else
        printf ("%d",cst);
}

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

    read ();
    solve ();

    return 0;
}