Pagini recente » Arhiva de probleme | Concursul National de Soft Grigore Moisil Lugoj | Cod sursa (job #1291153) | Cod sursa (job #1992053) | Cod sursa (job #2499086)
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
#define MAX 1000001
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int n,m,min1=INF;
struct NodCost{
int nod,cost;
};
vector <NodCost> G[21];
int dp[MAX][20];
void rezolvare()
{
int stare,i,j;
for (stare=1; stare<=((1<<n)-1); stare++)
{
for (i=0; i<n; i++)
{
if (((1<<i) & stare)>0 && dp[stare][i]!=INF)
{
for (auto j:G[i])
{
if (((1<<j.nod) & stare)==0)
dp[stare+(1<<j.nod)][j.nod]=min(dp[stare+(1<<j.nod)][j.nod],dp[stare][i]+j.cost);
}
}
}
}
}
int main()
{
int i,a,b,c;
fin>>n>>m;
for (i=1; i<=m; i++)
{
fin>>a>>b>>c;
G[a].push_back({b,c});
}
for (i=1; i<=(1<<n)-1; i++)
{
for (int j=0; j<n; j++)
{
dp[i][j]=INF;
}
}
dp[1][0]=0;
rezolvare();
for (i=1; i<n; i++)
{
for (auto j:G[i])
{
if (j.nod==0)
{
min1=min(min1,dp[(1<<n)-1][i]+j.cost);
}
}
}
if (min1!=INF)
fout<<min1;
else
fout<<"Nu exista solutie";
return 0;
}