Cod sursa(job #2934410)

Utilizator Teodor94Teodor Plop Teodor94 Data 5 noiembrie 2022 22:51:06
Problema Ciclu hamiltonian de cost minim Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;

#define MAX_N 18
#define INF 1000000000

int noNodes, noEdges;
vector<int> graph[MAX_N];
int cost[MAX_N][MAX_N];

int dp[MAX_N][1 << MAX_N];

void addEdge(int x, int y, int c) {
    graph[x].push_back(y);
    cost[x][y] = c;
}

bool hasEdge(int x, int y) {
    unsigned int i;

    i = 0;
    while (i < graph[x].size() && graph[x][i] != y)
        ++i;
    
    return i < graph[x].size();
}

int main() {
    FILE *fin, *fout;
    fin = fopen("hamilton.in", "r");
    fout = fopen("hamilton.out", "w");

    int i, j, mask;
    int x, y, c;
    int minCost;

    fscanf(fin, "%d%d", &noNodes, &noEdges);

    for (i = 0; i < noNodes; ++i)
        for (j = 0; j < noNodes; ++j)
            cost[i][j] = INF;

    for (i = 0; i < noEdges; ++i) {
        fscanf(fin, "%d%d%d", &x, &y, &c);
        addEdge(x, y, c);
    }

    for (mask = 0; mask < (1 << noNodes); ++mask)
        for (i = 0; i < noNodes; ++i)
            dp[i][mask] = INF;
            
    dp[0][1 << 0] = 0;
    for (mask = 0; mask < (1 << noNodes); ++mask)
        for (i = 0; i < noNodes; ++i)
            if (mask & (1 << i))
                for (int j : graph[i])
                    if ((mask & (1 << j)))
                        dp[j][mask] = min(dp[j][mask], dp[i][mask - (1 << j)] + cost[i][j]);

    minCost = INF;
    for (int j : graph[0])
        minCost = min(minCost, dp[j][(1 << noNodes) - 1] + cost[j][0]);
    
    if (minCost == INF)
        fprintf(fout, "Nu exista solutie\n");
    else
        fprintf(fout, "%d\n", minCost);

    fclose(fin);
    fclose(fout);
    return 0;
}