Pagini recente » Cod sursa (job #3152664) | Cod sursa (job #1321596) | Cod sursa (job #647763) | Cod sursa (job #112552) | Cod sursa (job #1800830)
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>v[20];
int n,m,x,y,sol,C,c[300000][20],cost[20][20];
int dp(int st, int stare, int fin)
{
if(c[stare][fin] == -1)
{
c[stare][fin]=20000000;
int precstare=0,x=0;
for(int i=0;i<v[fin].size();i++)
if( stare & (1<<v[fin][i]) )
{
if(v[fin][i]==st && ( ( stare ^ (1<<fin)) != (1<<st))) continue;
precstare=stare^(1<<fin);
x=dp(st,precstare,v[fin][i])+cost[v[fin][i]][fin];
if(x<c[stare][fin])c[stare][fin]=x;
}
}
return c[stare][fin];
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cost[i][j]=20000000;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&C);
cost[x][y]=C;
v[y].push_back(x);
}
memset(c,-1,sizeof(c));
for(int i=0;i<n;i++)
c[1<<i][i]=0;
sol=20000000;
for(int i=0;i<v[0].size();i++)
{
x=dp(0,(1<<n)-1,v[0][i])+cost[v[0][i]][i];
if(x<sol)sol=x;
}
if(sol!=20000000)printf("%d ",sol);
else printf("Nu exista solutie");
return 0;
}