Pagini recente » Cod sursa (job #2505733) | Cod sursa (job #3155942) | Cod sursa (job #2588362) | Cod sursa (job #809663) | Cod sursa (job #1375284)
#include <cstdio>
#include <vector>
#include <cstring>
#include <bitset>
#include <algorithm>
#define Nmax 18
#define INF 0x3f3f3f3f
using namespace std;
vector<pair<int,int> > G[Nmax];
bitset<Nmax>used[1<<Nmax];
int DP[1<<Nmax][Nmax];
int N,M,lim;
void Read()
{
scanf("%d%d",&N,&M);
lim = (1<<N)-1;
int a,b,c;
for(int i = 1; i <= M; ++i){
scanf("%d%d%d",&a,&b,&c);
G[b].push_back(make_pair(c,a));
}
}
int dynamic(int MASK,int k)
{
if(used[MASK][k])
return DP[MASK][k];
if(MASK == 0)
return INF;
for(vector<pair<int,int> >::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(MASK & (1<<it->second))
if(DP[MASK][k] > dynamic(MASK ^(1<<k), it->second) + it->first)
DP[MASK][k] = dynamic(MASK ^(1<<k),it->second) + it->first;
used[MASK][k] = 1; /// s-a calculat pentru starea asta
return DP[MASK][k];
}
void Solve()
{
memset(DP,INF,sizeof(DP));
DP[1][0] = 0;
used[1][0] = 1;
int best = INF;
for(vector<pair<int,int> >::iterator it = G[0].begin(); it != G[0].end(); ++it)
if(best > dynamic(lim,it->second) + it->first)
best = dynamic(lim,it->second) + it->first;
if(best == INF)
printf("Nu exista solutie\n");
else
printf("%d\n",best);
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
Read();
Solve();
return 0;
}