Nu aveti permisiuni pentru a descarca fisierul grader_test8.in
Cod sursa(job #687591)
Utilizator | Data | 22 februarie 2012 16:40:40 | |
---|---|---|---|
Problema | Ciclu hamiltonian de cost minim | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.97 kb |
#include <stdio.h>
#define maxn 1000000000
long n,m,i,a,b,k;
long v[20][20],g[300000][20],j;
int main()
{
freopen("hamilton.in","r",stdin);
freopen("hamilton.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
v[i][j]=-1;
}
}
int n2=1<<n;
for(i=1;i<=m;i++){
scanf("%ld%ld",&a,&b);
scanf("%ld",&v[a][b]);
}
for(i=1;i<n2;i++){
for(j=1;j<n;j++){
g[i][j]=maxn;
}
}
g[1][0]=0;
for(i=1;i<=n2;i++){
for(j=0;j<n;j++){
if(i!=1 && j==0) continue;
if(g[i][j]==maxn) continue;
for(k=0;k<n;k++){
if(!(i&(1<<k)) && v[j][k]>0){
if(g[i][j]+v[j][k]<g[i^(1<<k)][k] && v[j][k]>0){
g[i^(1<<k)][k]=g[i][j]+v[j][k];
}
}
}
}
}
long sol=maxn;
for(i=1;i<n;i++){
if(sol>g[n2-1][i]+v[i][0] && v[i][0]>0){
sol=g[n2-1][i]+v[i][0];
}
}
if(sol!=maxn){
printf("%ld",sol);
}else{
printf("Nu exista solutie");
}
return 0;
}