Pagini recente » Cod sursa (job #717385) | Cod sursa (job #1247552) | Cod sursa (job #1027927) | Cod sursa (job #1960019) | Cod sursa (job #1860588)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 20
#define INFINIT 0x3f3f3f3f
int n,m, dp[(1<<NMAX)][NMAX];
vector<int> g[NMAX];
int cost[(1<<NMAX)][NMAX];
typedef unsigned uint;
void citire()
{
scanf("%d %d ",&n,&m);
for (int i=0; i<n;i++)
{
for (int j=0;j<n;j++)
{
cost[i][j] = INFINIT;
}
}
for(int i=0;i<m;i++)
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
g[y].push_back(x);
cost[x][y]=c;
}
}
void dinamica()
{
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
dp[i][j]=INFINIT;
}
}
dp[1][0]=0;
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
if(i& (1<<j) )
{
for(vector<int>::iterator it=g[j].begin();it!=g[j].end();it++)
{
if(i & (1<<*it))
{
dp[i][j]=min(dp[i][j], dp[i^(1<<j)][*it] + cost[*it][j]);
}
}
}
}
}
int mincost = INFINIT;
for(vector<int>::iterator it=g[0].begin();it!=g[0].end();it++)
{
mincost = min(mincost,dp[(1<<n)-1][*it] + cost[*it][0]);
}
if(mincost!=INFINIT)
printf("%d\n",mincost);
else printf("Nu exista solutie\n");
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
citire();
dinamica();
return 0;
}