BOJ|10971外販員巡回2
| Link
BOJ 10971
| Problem
海外販売員の巡回問題は英語で旅行Salesman問題(TSP)と呼ばれる問題であり、コンピュータ科学分野で最も重要な問題の一つである.様々な変種問題がありますが、最も一般的な形式の問題を見てみましょう.
1番からN番までの都市があり、都市の間に道があります.(道がないかもしれませんが)今あるセールスマンはある都市を出発して、N都市を通って、元の都市に戻るツアー旅行ルートを計画しています.でも、もう一回行った町には行けない.(最後に旅行を始めた都市に戻るのを除く)このような旅行ルートはいろいろあるかもしれませんが、最小限の旅行計画を立てたいと思っています.
行列W[i][j]の形で各パス時間の移動に要する費用が与えられる.W[i][j]は、都市iから都市jまでの料金を示す.費用は非対称です.すなわち、W[i][j]はW[j][i]とは異なる場合がある.すべての都市の費用は正の整数です.W[i][i]は常に0.場合によっては、都市iから都市jまでは不可能であり、この場合、W[i][j]=0となる.
Nと費用行列が与えられた場合、費用が最も低いセールスマンの巡回旅行経路を解くプログラムを作成します.
入力
1行目は都市の数Nを与える.(2≦N≦10)次のN行には費用行列がある.各行列の成分は1000000以下の正の整数であり、行けない場合は0を与える.W[i][j]は都市iからjまでの料金を表す.
常に巡ることができる場合のみ入力されます.
1つの都市から、すべての都市を経て、起点のすべての状況に戻ります.
最も低コスト(1都市で重複しない)
-都市数が10以下であるため、
boolean check[10]
min(answer, cost+w[node][s_node] // s_node == start node
-訪問都市数==合計都市数count == n
最初の都市に戻らなければなりませんw[node][s_node] != 0 // s_node == start node
| Code
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;
bool check[10] = {0,};
int answer = 999999999;
int w[10][10];
int n, s_node;
void DFS(int node, int cost, int count) {
if(count == n)
if (w[node][s_node])
{
answer = min(answer, cost + w[node][s_node]);
}
for (int i = 0; i < n; i++)
{
if (check[i] == false && w[node][i] != 0)
{
check[i] = true;
DFS(i, cost + w[node][i], count + 1);
check[i] = false;
}
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
scanf("%d", &w[i][j]);
}
for (int i = 0; i < n; i++)
{
s_node = i;
check[i] = true;
DFS(i,0,1);
check[i] = false;
}
printf("%d", answer);
}
| Result
Reference
この問題について(BOJ|10971外販員巡回2), 我々は、より多くの情報をここで見つけました https://velog.io/@2rlo/BOJ-10971-외판원-순회-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol