Pagini recente » Cod sursa (job #1101457) | Cod sursa (job #2802703) | Istoria paginii happy-birthday-infoarena-2014/clasament | Istoria paginii runda/rhle4myass | Cod sursa (job #1219270)
#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[Nmax][20]; /// 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 mask ,int nod)
{
if(DP[mask][nod])
return DP[mask][nod];
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(mask^(1<<nod),*it) + cost[*it][nod]);
DP[mask][nod] = crt;
return DP[mask][nod];
}
void solve ( void )
{
int best = INF;
for(vector<int>::iterator it = G[0].begin(); it != G[0].end(); ++it)
best = min(best, dynamic((1<<N)-1,*it) + 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;
}