Pagini recente » Cod sursa (job #3295240) | Cod sursa (job #467712) | Cod sursa (job #2545597) | Cod sursa (job #807471) | Cod sursa (job #2547320)
#define NMAX 18
#define NRMAX (1<<18)-1
#define INF 0x3f3f3f3f
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("hamilton.in");
ofstream g("hamilton.out");
int n, m;
int x, y, c;
int cost[NMAX][NMAX];
int dp[NMAX][NRMAX];
int amcalculat[NMAX][NRMAX];
void init(){
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cost[i][j] = INF;
}
void citire(){
f>>n>>m;
init();
for(int i=1; i<=m; i++){
f>>x>>y>>c;
cost[x][y] = c;
}
}
int parcurg(int i, int j){
int vmin = INF;
if(amcalculat[i][j] == 1)
return dp[i][j];
if((1<<i | 1) == j)
return cost[0][i];
for(int x=1; x<n; x++){
if(cost[x][i]!=INF && (j&(1<<x)) ){
vmin = min(parcurg(x, j^(1<<i)) + cost[x][i], vmin);
}
}
dp[i][j] = vmin;
amcalculat[i][j] = 1;
return dp[i][j];
}
int main()
{
citire();
int afis = INF;
//for(int v=0; v<n; v++)
// if(cost[v][0]!=INF)
// dp[v][(1<<n)-1] = parcurg(v, (1<<n)-1);
int nr = (1<<n) - 1;
for(int v=0; v<n; v++){
if(cost[v][0]!=INF){
afis = min(parcurg(v, nr) + cost[v][0], afis);
}
}
//g<<afis;
if(afis == INF)
g<<"Nu exista solutie";
else g<<afis;
return 0;
}