tsp16

 avatar
unknown
c_cpp
a year ago
3.1 kB
6
Indexable
#include <climits>

bool check_bit(unsigned int bit, int pos) {
    return bit & (1 << pos);
}

unsigned int assign_bit_with_0(unsigned int bit, int pos) {
    return bit & ~(1 << pos);
}

string arr_number_to_string(int arr[], int size) {
    string result;
    for (int i = 0; i < size; ++i) {
        if (arr[i] >= 0 && arr[i] <= 25) {
            result += 'A' + arr[i];
        } else {
            result += '?';
        }
        if (i < size - 1) {
            result += ' ';
        }
    }
    return result;
}

string Traveling(int G[20][20], int n, char character_type) {
    // cout<<n;
    // cout<<character_type;
    int start_vertex = character_type - 'A';
    int max_states = 1 << n;
    int **dp = new int *[max_states];
    int **path = new int *[max_states];
    for (int i = 0; i < max_states; ++i) {
        dp[i] = new int[n];
        path[i] = new int[n];
        for (int j = 0; j < n; ++j) {
            dp[i][j] = INT_MAX;
            path[i][j] = -1;
        }
    }
    dp[1 << start_vertex][start_vertex] = 0;

    for (int mask = 1; mask < (1 << n); mask++) {
        for (int i = 0; i < n; i++) {
            if (!check_bit(mask, i)) continue;
            for (int j = 0; j < n; j++) {
                if (check_bit(mask, j) && i != j && G[j][i] != 0 && dp[assign_bit_with_0(mask, i)][j] != INT_MAX) {
                    int tempCost = dp[assign_bit_with_0(mask, i)][j] + G[j][i];
                    if (tempCost < dp[mask][i]) {
                        dp[mask][i] = tempCost;
                        path[mask][i] = j;
                    }
                }
            }
        }
    }
    int final_mask = (1 << n) - 1;
    int result = INT_MAX;
    int last_city = -1;
    for (int i = 0; i < n; i++) {
        if (i != start_vertex && dp[final_mask][i] < INT_MAX && G[i][start_vertex] != 0) {
            int tempCost = dp[final_mask][i] + G[i][start_vertex];
            if (tempCost < result) {
                result = tempCost;
                last_city = i;
            }
        }
    }

    if (result == INT_MAX) {
        cout << "Không có hành trình nào thỏa mãn." << endl;
        for (int i = 0; i < max_states; ++i) {
            delete[] dp[i];
            delete[] path[i];
        }
        delete[] dp;
        delete[] path;
        return "";
    } else {
        int backtrack_path[n + 1];
        int mask = final_mask;
        int city = last_city;
        int index = n;

        while (city != -1) {
            backtrack_path[index--] = city;
            int temp = mask;
            mask = assign_bit_with_0(mask, city);
            city = path[temp][city];
        }
        backtrack_path[0] = start_vertex;
        int repair_backtrack[n];
        for (int i = 0; i < n; i++) {
            repair_backtrack[i] = backtrack_path[i + 1];
        }
        for (int i = 0; i < max_states; ++i) {
            delete[] dp[i];
            delete[] path[i];
        }
        delete[] dp;
        delete[] path;
        return arr_number_to_string(repair_backtrack, n) + " " + character_type;
    }
}
Editor is loading...
Leave a Comment