Cod sursa(job #1587859)

Utilizator SilviuIIon Silviu SilviuI Data 2 februarie 2016 17:15:54
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define lmax 300010

using namespace std;

int n,m,x,y,z;
int dp[20][lmax];
bool viz[20][lmax];
vector < pair<int,int> > g[20];

int memo(int nod,int mask)
{
    if (viz[nod][mask]) return dp[nod][mask];
    viz[nod][mask]=true;
    for (int i=0;i<(int)g[nod].size();i++)
        if (mask&(1<<g[nod][i].first)) {
            if (g[nod][i].first==0 && mask-(1<<nod)!=1) continue;
            dp[nod][mask]=min(dp[nod][mask],memo(g[nod][i].first,mask-(1<<nod))+g[nod][i].second);
    }
    return dp[nod][mask];
}

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,&z);
        g[y].push_back(make_pair(x,z));
    }

    int maxx=(1<<n)-1;

    for (int i=0;i<n;i++)
        for (int j=0;j<=maxx;j++)
            dp[i][j]=2e9;

    dp[0][1]=0; viz[0][1]=true;

    for (int i=0;i<(int)g[0].size();i++)
        dp[0][maxx]=min(dp[0][maxx],memo(g[0][i].first,maxx)+g[0][i].second);

    if (dp[0][maxx]==2e9) puts("Nu exista solutie"); else
        printf("%d\n",dp[0][maxx]);

    return 0;
}