Nu aveti permisiuni pentru a descarca fisierul grader_test22.in

Cod sursa(job #2172104)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 15 martie 2018 15:03:53
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("hamilton.in") ;
ofstream fout("hamilton.out") ;

vector<int> graf[20];
int dp[1<<20][20] ;
int cost[20][20] ;
int n , m ;

void citire()
{
    int i , x , y , c ;
    fin >> n >> m ;
    for ( i = 0 ; i < n ; i++ )
        for ( int j = 0 ; j < n ; j++ )
            cost[i][j] = 0x3f3f3f3f ;
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y >> c ;
        graf[x].push_back(y) ;
        cost[x][y] = c;
    }
}

void ciclu()
{
    int i , j , k , vecin ;
    for ( i = 1 ; i <= (1<<n)-1 ; i++ )
        for ( j = 0 ; j < n ; j++ )
            dp[i][j] = 0x3f3f3f3f ;
   dp[1][0] = 0 ;
    for ( i = 1 ; i <= (1<<n)-1 ; i++ )
    {
        for ( j = 0 ; j < n ; j++ )
        {
            if ( (i&(1<<j)) != 0 )
            {
                for ( k = 0 ; k < graf[j].size() ; k++ )
                {
                    vecin = graf[j][k] ;
                    if ( (i&(1<<vecin)) == 0 )
                    {
                        dp[i|(1<<vecin)][vecin] = min(dp[i][j] + cost[j][vecin], dp[i|(1<<vecin)][vecin] ) ;
                    }
                }
            }
        }
    }
    int rez = 0x3f3f3f3f ;
    for ( i = 0 ; i < n ; i++ )
    {
        if ( cost[i][0] != 0x3f3f3f3f )
            rez = min(rez,dp[(1<<n)-1][i]+cost[i][0]) ;
    }
    if ( rez == 0x3f3f3f3f )
        fout << "Nu exista solutie" ;
    else
        fout << rez;
}

int main()
{
    citire() ;
    ciclu() ;
}