Cod sursa(job #1749018)

Utilizator akaprosAna Kapros akapros Data 27 august 2016 17:53:04
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define maxN 20
#define maxP (1 << 18) + 2
#define mp make_pair
#define pii pair < int, int >
#define f first
#define s second
#define inf 1000000000
using namespace std;
int n, m, all, ans, dp[maxN][maxP];
vector < pii > V[maxN];
void read()
{
    freopen("hamilton.in", "r", stdin);
    scanf("%d %d", &n, &m);
    while (m --)
    {
        int x, y, c;
        scanf("%d %d %d", &x, &y, &c);
        V[y].push_back(mp(x, c));
    }
}
int Cost(int x, int conf)
{
    int i, nod;
    if (dp[x][conf] != -1)
        return dp[x][conf];
    dp[x][conf] = inf;
    for (i = 0; i < V[x].size(); ++ i)
        if (conf & (1 << (nod = V[x][i].f)))
    {
        if (nod == 0 && conf != (1 << x) + 1)
            continue;
        if (dp[x][conf] > Cost(nod, conf ^ (1 << x)) + V[x][i].s)
        dp[x][conf] = dp[nod][conf ^ (1 << x)] + V[x][i].s;
    }
    return dp[x][conf];
}
void init()
{
    all = (1 << n) - 1;
    memset(dp, -1, sizeof(dp));
    dp[0][1] = 0;
    ans = inf;
}
void solve()
{
    int i;
    init();
    for (i = 0; i < V[0].size(); ++ i)
        if (Cost(V[0][i].f, all) + V[0][i].s < ans)
            ans = dp[V[0][i].f][all] + V[0][i].s;
}
void write()
{
    freopen("hamilton.out", "w", stdout);
    printf("%d\n", ans);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}