Cod sursa(job #650815)

Utilizator FIIGGTGafita Grigore Tarsichi FIIGGT Data 18 decembrie 2011 23:34:56
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdio.h>
#include<limits.h>
#define maxN 20
#define max (1 << 20) 
#define inf (1<<27)
int cost[maxN][maxN], res[max][maxN];

void read_data(FILE *fin,int M)
{
    int i;
    for (i = 1; i <= M; ++i) 
    {
        int x, y, z;
        fscanf(fin, "%d %d %d", &x, &y, &z);
        cost[x][y] = z;
    }
}
int min(int x, int y)
{
    if(x>y)
        return y;
    return x;
}
void result(int N)
{
    FILE *fout;
    fout = fopen("hamilton.out", "w");
    int i,x=inf;
    for (i = 0; i < N; ++i)
        if (res[(1 << N) - 1][i] != inf) 
            x = min(x, res[(1 << N) - 1][i] + cost[i][0]);
    if (x == inf)
        fprintf(fout, "Nu exista solutie");
    else
        fprintf(fout, "%d", x);
    fclose(fout);   
}
void matrix_init(int N)
{
    int i,j;
    for (i = 0; i <= N; ++i)
        for (j = 0; j <= N; ++j)
            cost[i][j] = inf;
    for (i = 0; i < (1 << N); ++i)
        for (j = 0; j < N; ++j)
            res[i][j] = inf;
}
void build_matrix(int N)
{
    res[1][0] = 0;
    int j,bit,i;
    for (j = 0; j < (1 << N); ++j)
        for (i = 0; i < N; ++i) 
        {
        if (j & (1 << i))
            for (bit = 0; bit < N; ++bit) 
            {
                if (j & (1 << bit))
                    if (!(cost[bit][i] == inf))
                          if (!(bit == i))
                                  res[j][i] = min(res[j][i], res[j - (1 << i)][bit] + cost[bit][i]);
            }
        } 
}
int main() 
{
    FILE *fin;
    fin = fopen("hamilton.in", "r");   
    int N, M;
    fscanf(fin, "%d %d", &N, &M);
    matrix_init(N);
    read_data(fin,M);
    build_matrix(N);
    result(N);
    fclose(fin);
    return 0;
}