Cod sursa(job #1360189)

Utilizator robertstrecheStreche Robert robertstreche Data 25 februarie 2015 12:33:33
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define NMAX 20
#define INF 1<<30
#define P 1<<20

using namespace std;

int n,m,x,y;
long long sol=INF;
int cost[NMAX][NMAX],best[P][NMAX];

vector <int>v[NMAX];

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

    scanf("%d %d",&n,&m);

    for (int i=0;i<(1<<n);i++)
      for (int j=0;j<n;j++)
        best[i][j]=INF;

    for (int i=1;i<=m;i++)
     {
        scanf("%d %d",&x,&y);
        v[y].push_back(x);
        scanf("%d",&cost[x][y]);
     }
    best[1][0]=0;
    for (int i=1;i<(1<<n);i++)
      for (int j=0;j<n;j++)
        if (i&(1<<j))
          for (vector <int>::iterator it=v[j].begin();it!=v[j].end();it++)
            if (i&(1<<(*it)) && best[i][j]>best[i^(1<<j)][*it]+cost[*it][j])
               best[i][j]=best[i^(1<<j)][*it]+cost[*it][j];

    for (vector <int>::iterator it=v[0].begin();it!=v[0].end();it++)
       if (sol>best[(1<<n)-1][*it]+cost[*it][0])
         sol=best[(1<<n)-1][*it]+cost[*it][0];
    if (sol<INF)
     printf("%lld",sol);
    else
     printf("Nu exista solutie");
}