Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- using graph = vector< vector<int> >;
- using min_way_matr = vector< vector<int> >;
- const int INF = 10000;
- // нахождение минимального пути, оканчивающегося на точке u
- int solve(int u, int mask, const graph & g, min_way_matr & dp) {
- int n = g.size();
- // если минимальный путь уже найден
- if(dp[u][mask] != -1) return dp[u][mask];
- // если точки u нет в подмножестве
- if(!(mask & (1 << u))) return INF;
- dp[u][mask] = INF;
- for(int v = 0; v < n; v++)
- dp[u][mask] = min(
- dp[u][mask],
- solve(v, mask ^ (1 << u), g, dp) + g[u][v]
- );
- return dp[u][mask];
- }
- int main() {
- int n; // кол-во точек в графе
- int ans; // минимальный гамильтонов путь (ответ на задачу)
- int start = 0; // начальная точка (n - 1)
- graph g; // граф, в котором ищем гамильтонов путь
- min_way_matr dp;
- /*
- dp[i][mask] показывает минимальный гамильтонов путь, оканчивающийся
- точкой i и содержащий точки, находящиеся в подмножестве mask
- mask = 110101 <=> {0, 2, 4, 5}
- */
- cin >> n;
- g.resize(n, vector<int>(n));
- dp.resize(n, vector<int>(1 << n, -1));
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- cin >> g[i][j];
- dp[start][1 << start] = 0;
- ans = INF;
- for(int i = 0; i < n; i++)
- ans = min(
- ans,
- solve(i, (1 << n) - 1, g, dp)
- );
- cout << "Minimal way : " << ans << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement