Cod sursa(job #1552218)

Utilizator SilviuIIon Silviu SilviuI Data 17 decembrie 2015 14:42:51
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#include <vector>
#define mp make_pair
#define s1 second
#define f1 first
#define inf 0x3f3f3f3f
using namespace std;
 
int n,m,x,y,cost,dp[(1<<18)+5][20];
bool fr[(1<<18)+5][20];
vector < pair<int,int> > g[20];
 
int memo(int mask,int nod)
{
    if (mask==0) return 0;
    if (fr[mask][nod]) return dp[mask][nod];
    fr[mask][nod]=true;
    for (unsigned int i=0;i<g[nod].size();i++)
        if (((mask>>g[nod][i].f1)&1)==1) {
        	if (g[nod][i].f1==0 && mask>1) continue;
            dp[mask][nod]=min(dp[mask][nod],memo(mask-(1<<g[nod][i].f1),g[nod][i].f1)+g[nod][i].s1);
        }
    return dp[mask][nod];
}
 
int main(){
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (int i=1;i<=m;i++) {
        scanf("%d %d %d",&x,&y,&cost);
        g[y].push_back(mp(x,cost));
    }
    for (int i=0;i<(1<<n);i++)
        for (int j=0;j<n;j++)
        dp[i][j]=inf;
    int mask=(1<<n)-1,sol=inf;
    for (unsigned int i=0;i<g[0].size();i++)
        sol=min(sol,memo(mask-(1<<g[0][i].f1),g[0][i].f1)+g[0][i].s1);
    if (sol==inf) { puts("Nu exista solutie"); return 0; }
    printf("%d",sol);
    return 0;
}