Pagini recente » Cod sursa (job #2047717) | Cod sursa (job #330543) | Cod sursa (job #1888027) | Cod sursa (job #2074153) | Cod sursa (job #1610094)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int nmx = 18;
const int nmx2 = (1 << 18);
const int inf = 0x3f3f3f3f;
int n,m,dp[nmx2][nmx],cost[nmx][nmx],ans = inf;
vector <int> g[nmx];
void citire(){
scanf("%d %d", &n, &m);
int nod1,nod2;
for(int i = 1; i <= m; ++i){
scanf("%d %d", &nod1, &nod2);
g[nod2].push_back(nod1);
scanf("%d", &cost[nod1][nod2]);
}
}
void hamilton(){
dp[1][0] = 0;
for(int i = 0; i < (1 << n); ++i)
for(int j = 0; j < n; ++j)
if(i & (1 << j))
for(unsigned int k = 0; k < g[j].size(); ++k)
if(i & (1 << g[j][k]))
dp[i][j] = min(dp[i][j],dp[i ^ (1 << j)][g[j][k]] + cost[g[j][k]][j]);
for(int i = 0; i < g[0].size(); ++i)
ans = min(ans,dp[(1<<n)-1][g[0][i]] + cost[g[0][i]][0]);
}
int main(){
freopen("hamilton.in", "r", stdin);
freopen("hamilton.out", "w", stdout);
citire();
memset(dp,inf,sizeof(dp));
hamilton();
if(ans == inf)
printf("Nu exista solutie\n");
else
printf("%d\n", ans);
return 0;
}