Cod sursa(job #529893)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 6 februarie 2011 14:19:32
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>
#include <fstream.h>

int e,n,i,j,minn=1000000000,d[280000][20],v[3][400];

int main()
{
    ifstream fin("hamilton.in");
    freopen("hamilton.out","w",stdout);
    fin>>n>>e;
    for (i=1;i<=e;++i)
        fin>>v[0][i]>>v[1][i]>>v[2][i];
    for (i=1;i<=e;++i)
        if (!v[0][i])
            d[1+(1<<v[1][i])][v[1][i]]=v[2][i];
    for (i=1;i<(1<<n)-1;i+=2)
        for (j=1;j<=e;++j)
            if ((v[0][j])&&(d[i][v[0][j]])&&(v[1][j])&&((i/(1<<v[1][j]))%2==0)&&((!d[i+(1<<v[1][j])][v[1][j]])||(d[i+(1<<v[1][j])][v[1][j]]>d[i][v[0][j]]+v[2][j])))
            {
                d[i+(1<<v[1][j])][v[1][j]]=d[i][v[0][j]]+v[2][j];
            }
    for (i=1;i<=e;++i)
        if ((!v[1][i])&&(minn>d[(1<<n)-1][v[0][i]]+v[2][i]))
            minn=d[(1<<n)-1][v[0][i]]+v[2][i];
    if (minn==1000000000) printf("Nu exista solutie");
    else printf("%d",minn);
    return 0;
}