Cod sursa(job #977725)

Utilizator andrettiAndretti Naiden andretti Data 26 iulie 2013 15:04:03
Problema Ciclu hamiltonian de cost minim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define maxn 25
#define maxmask 1<<18
#define inf 0x3f3f3f3f
using namespace std;

int n,m;
int s[maxn][maxmask],c[maxn][maxn];
vector <int> lt[maxn];

void read()
{
    int x,y,cost;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&cost);
        lt[y].pb(x);
        c[x][y]=cost;
    }
}

void det(int k,int mask)
{
    int minn=inf,newk;
    int newmask=mask^(1<<k);
    for(unsigned int i=0;i<lt[k].size();i++)
     if( ((mask>>lt[k][i])&1)==1 )
     {
         newk=lt[k][i];
         if(s[newk][newmask]==0 && newmask!=(1<<newk)) det(newk,newmask);
         minn=min(minn,s[newk][newmask]+c[newk][k]);
     }
     s[k][mask]=minn;
}

void solve()
{
    int sol=inf,maskf=(1<<n)-1;
    int k;

    for(int i=0;i<n;i++) det(i,maskf);
    if(s[0][maskf]!=inf)
    for(unsigned int i=0;i<lt[0].size();i++)
     sol=min(sol,s[lt[0][i]][maskf]+c[lt[0][i]][0]);

    if(sol==inf) printf("Nu exista solutie");
    else
    printf("%d",sol);
}

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

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}