Nu aveti permisiuni pentru a descarca fisierul grader_test22.in
Cod sursa(job #2172104)
Utilizator | 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() ;
}