Cod sursa(job #2444353)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 31 iulie 2019 12:29:21
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define N 20
#define INF 20000000
using namespace std;
typedef long long ll;
int dp[300005][N], x, y, i, n, m, cost[20][20], ans, j, ci, b;
vector<int> v[20];
void fast()
{
    ios_base::sync_with_stdio(false);
    cin.tie();
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
}
int main()
{
    fast();
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        cin>>x>>y;
        cin>>cost[x][y];
    }
    for(i=2;i<(1<<n);i++)
        for(j=0;j<n;j++)
            if(i&(1<<j))
    {
        ci=i;
        b=0;
        dp[i][j]=INF;
        while(ci)
        {
            if(ci%2&&cost[b][j])
                dp[i][j]=min(dp[i-(1<<j)][b]+cost[b][j],dp[i][j]);
            b++;
            ci/=2;
        }
   //     cout<<dp[i][j]<<' ';
    }
    ans=INF;
    for(j=0;j<n;j++)
        if(cost[j][0])
        ans=min(ans,dp[(1<<n)-1][j]+cost[j][0]);
    if(n==1)
    {
        cout<<"0\n";
        return 0;
    }
    if(ans==INF)
        cout<<"Nu exista solutie";
    else cout<<ans<<'\n';
    return 0;
}