Pagini recente » Borderou de evaluare (job #1718043) | Borderou de evaluare (job #2296924) | Borderou de evaluare (job #1710772) | Borderou de evaluare (job #2008319) | Cod sursa (job #1219269)
#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;
}
}
int dynamic (int nod, int mask)
{
if(DP[nod][mask])
return DP[nod][mask];
if(mask == 1)
return 0;
int crt = INF;
for(vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
if(mask & (1<<*it))
if(*it != 0 || *it == 0 && mask > 1)
crt = min( crt , dynamic(*it,mask^(1<<nod)) + cost[*it][nod]);
DP[nod][mask] = crt;
return DP[nod][mask];
}
void solve ( void )
{
int best = INF;
for(vector<int>::iterator it = G[0].begin(); it != G[0].end(); ++it)
best = min(best, dynamic(*it,(1<<N)-1) + cost[*it][0]);
if(best >= INF)
{
printf("Nu exista solutie\n");
return;
}
printf("%d\n",best);
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
read();
solve();
return 0;
}