Pagini recente » Cod sursa (job #2667413) | Cod sursa (job #960775) | Cod sursa (job #1236716) | Cod sursa (job #2806174) | Cod sursa (job #1587859)
#include <stdio.h>
#include <vector>
#include <algorithm>
#define lmax 300010
using namespace std;
int n,m,x,y,z;
int dp[20][lmax];
bool viz[20][lmax];
vector < pair<int,int> > g[20];
int memo(int nod,int mask)
{
if (viz[nod][mask]) return dp[nod][mask];
viz[nod][mask]=true;
for (int i=0;i<(int)g[nod].size();i++)
if (mask&(1<<g[nod][i].first)) {
if (g[nod][i].first==0 && mask-(1<<nod)!=1) continue;
dp[nod][mask]=min(dp[nod][mask],memo(g[nod][i].first,mask-(1<<nod))+g[nod][i].second);
}
return dp[nod][mask];
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=m;i++) {
scanf("%d %d %d",&x,&y,&z);
g[y].push_back(make_pair(x,z));
}
int maxx=(1<<n)-1;
for (int i=0;i<n;i++)
for (int j=0;j<=maxx;j++)
dp[i][j]=2e9;
dp[0][1]=0; viz[0][1]=true;
for (int i=0;i<(int)g[0].size();i++)
dp[0][maxx]=min(dp[0][maxx],memo(g[0][i].first,maxx)+g[0][i].second);
if (dp[0][maxx]==2e9) puts("Nu exista solutie"); else
printf("%d\n",dp[0][maxx]);
return 0;
}