Cod sursa(job #2446531)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 9 august 2019 14:22:34
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<cstring>
#define N 19
#define dim 262150
#define Inf 342000001

using namespace std;

vector<int> GT[N];
int n,m,cost[N][N],dp[dim][N],ans;

void read()
{
    ifstream fin("hamilton.in");
    fin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        cost[i][j]=Inf;
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        GT[y].push_back(x);
        cost[x][y]=c;
    }
    fin.close();
}

int solve_dp(int start,int mask,int k)
{
    if(k==start && mask==(1<<start)) return dp[start][1<<start]=0;
    if(dp[mask][k]==-1)
    {
        dp[mask][k]=Inf;
        vector<int>::iterator it;
        for(it=GT[k].begin();it!=GT[k].end();it++)
        {
            if(mask & (1<<(*it)))
                {
                    if((*it)==start && (mask & ~(1<<k))!=(1<<start) ) continue;
                    dp[mask][k]=min(dp[mask][k],solve_dp(start,mask & ~(1<<(k)),*it)+cost[*it][k]);
                }
        }
    }

    return dp[mask][k];

}


void solve()
{
    ofstream fout("hamilton.out");
    int i,j,ans=Inf;
    for(i=0;i<n;i++)
    {
        memset(dp,-1,sizeof(dp));
        vector<int>::iterator it;
        for(it=GT[i].begin();it!=GT[i].end();it++)
           {
               ans=min(ans,solve_dp(i,(1<<n)-1,(*it))+cost[*it][i]);
               //cout<<(*it)<<' '<<ans<<' ';
           }
        cout<<i<<' '<<ans<<endl;
    }
    if(ans!=Inf) fout<<ans;
    else fout<<"Nu exista solutie";
    fout.close();

}


int main()
{
    read();
    solve();

}