fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. double dis[8][8]; //도시 사이의 거리
  6. bool check[8]; //이미 지나간 도시
  7. int N; //도시의 수
  8. double result; //결과값
  9.  
  10. //start: 시작하는 도시, cnt: 거쳐간 도시의 수, sum: 지나온 거리
  11. void solution(int start, int cnt, double sum)
  12. {
  13. if (cnt == N - 1) //도시를 전부 지났을 때
  14. {
  15. if (result > sum) //기존의 결과값에 비해 지나온 거리가 짧을 때
  16. result = sum;
  17. return;
  18. }
  19.  
  20. for (int i = 0; i < N; i++)
  21. {
  22. if (start != i && !check[i])
  23. {
  24. check[i] = check[start] = true; //지나온 도시를 생략
  25. solution(i, cnt + 1, sum + dis[start][i]);
  26. check[i] = check[start] = false; //새로운 경로 탐색을 위해
  27. }
  28. }
  29. }
  30.  
  31. int main(void)
  32. {
  33. //소수점 10자리 출력
  34. cout << fixed;
  35. cout.precision(10);
  36.  
  37. int C;
  38. cin >> C;
  39.  
  40. while (C--)
  41. {
  42. cin >> N;
  43.  
  44. for (int i = 0; i < N; i++)
  45. {
  46. for (int j = 0; j < N; j++)
  47. {
  48. cin >> dis[i][j];
  49. result += dis[i][j];
  50. }
  51. }
  52. for (int i = 0; i < N; i++)
  53. solution(i, 0, 0);
  54. cout << result << endl;
  55. }
  56. }
Success #stdin #stdout 0s 5548KB
stdin
2
3
0.0000000000  611.6157225201  648.7500617289
611.6157225201  0.0000000000  743.8557967501
648.7500617289  743.8557967501  0.0000000000
4
0.0000000000  326.0008994586  503.1066076077  290.0250922998
326.0008994586  0.0000000000  225.1785728436  395.4019367384
503.1066076077  225.1785728436  0.0000000000  620.3945520632
290.0250922998  395.4019367384  620.3945520632  0.0000000000
stdout
1260.3657842490
841.2045646020