Pagini recente » Cod sursa (job #34691) | Cod sursa (job #3002719) | Cod sursa (job #2601639) | Cod sursa (job #2035419) | Cod sursa (job #977725)
Cod sursa(job #977725)
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define maxn 25
#define maxmask 1<<18
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int s[maxn][maxmask],c[maxn][maxn];
vector <int> lt[maxn];
void read()
{
int x,y,cost;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&cost);
lt[y].pb(x);
c[x][y]=cost;
}
}
void det(int k,int mask)
{
int minn=inf,newk;
int newmask=mask^(1<<k);
for(unsigned int i=0;i<lt[k].size();i++)
if( ((mask>>lt[k][i])&1)==1 )
{
newk=lt[k][i];
if(s[newk][newmask]==0 && newmask!=(1<<newk)) det(newk,newmask);
minn=min(minn,s[newk][newmask]+c[newk][k]);
}
s[k][mask]=minn;
}
void solve()
{
int sol=inf,maskf=(1<<n)-1;
int k;
for(int i=0;i<n;i++) det(i,maskf);
if(s[0][maskf]!=inf)
for(unsigned int i=0;i<lt[0].size();i++)
sol=min(sol,s[lt[0][i]][maskf]+c[lt[0][i]][0]);
if(sol==inf) printf("Nu exista solutie");
else
printf("%d",sol);
}
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
read();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}