Pagini recente » Cod sursa (job #1812715) | Cod sursa (job #2628953) | Cod sursa (job #468282) | Cod sursa (job #629672) | Cod sursa (job #2232966)
#include <iostream>
#include <fstream>
#define zeros(x) (x^(x-1))&x
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int n,m,a,c1,c2,i,j,l,k,nr,rez,inf;
int cm[20][20], v[20];
int main() {
fin>>n>>m;
inf=(1<<30);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cm[i][j]=inf;
while(m--)
{
fin>>a>>k;
fin>>cm[a][k];
}
l=(1<<n)-1;
int dp[n][l];
short id[n][l];
short lg[l];
for(a=0;a<n;a++)
for(i=1;i<=l;i++)
{
dp[a][i]=inf;
id[a][i]=0;
}
for(a=0;a<n;a++)
{
dp[a][1<<a]=0;
id[a][1<<a]=a;
cm[a][a]=inf;
}
lg[1]=0;
for(a=2;a<=l;a<<=1)
lg[a]=lg[a/2]+1;
for(i=1;i<=l;i++)
{
c1=i; nr=0;
while(c1)
{
v[++nr]=lg[zeros(c1)];
c1-=zeros(c1);
}
for(c1=1;c1<=nr;c1++)
{
a=v[c1];
for(c2=1;c2<=nr;c2++)
{
j=v[c2];
if(cm[j][a]!=inf && dp[a][i^(1<<j)]!=inf)
{
k=dp[a][i^(1<<j)]+cm[j][a];
if(k<dp[j][i])
{
dp[j][i]=k;
id[j][i]=id[a][i^(1<<j)];
}
}
}
}
}
rez=inf;
for(a=0;a<n;a++)
rez=min(rez, dp[a][l]+cm[id[a][l]][a]);
fout<<rez<<"\n";
}