Pagini recente » Cod sursa (job #166824) | Istoria paginii runda/ojiii | Cod sursa (job #1582525) | Cod sursa (job #1956419) | Cod sursa (job #1219261)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define Nmax ((1<<18)+666)
#define INF 0x3f3f3f3f
using namespace std;
vector<int> G[20];
int cost[20][20],N,M;
int DP[20][Nmax]; /// DP[i][j] -> costul minim de a ajunge in nodul i trecand prin maska j
void read ( void )
{
scanf("%d%d",&N,&M);
int a,b,c;
for(int i = 1; i <= M; ++i){
scanf("%d%d%d",&a,&b,&c);
G[b].push_back(a);
cost[a][b] = c;
}
}
void prepare ( void )
{
memset(DP,INF,sizeof(DP));
DP[0][1] = 0;
}
void solve ( void )
{
for(int mask = 0; mask < (1<<N); ++mask)
for(int i = 0; i < N; ++i)
if(mask & (1<<i))
for(vector<int>::iterator it = G[i].begin();it!= G[i].end(); ++it)
if(mask & (1<<*it))
if(DP[i][mask] > DP[*it][mask^(1<<i)] + cost[*it][i])
DP[i][mask] = DP[*it][mask^(1<<i)] + cost[*it][i];
int best = INF;
for(vector<int>::iterator it = G[0].begin(); it != G[0].end(); ++it)
best = min ( best, DP[*it][(1<<N)-1] + cost[*it][0]);
if(best >= INF)
best = -1;
printf("%d\n", best);
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
read();
prepare();
solve();
return 0;
}