Chinaunix

标题: 最短的距离 [打印本页]

作者: patagonia2    时间: 2016-05-07 15:44
标题: 最短的距离
遇到这个问题,没什么思路。

请问各位大圣这种情况怎么处理呢。



例如,给出以下距离:

pit-01 ->  pit-02 = 464
pit-01 ->  pit-03 = 518
pit-02 ->  pit-03 = 141

因此,可能的途径有:

pit-01 ->  pit-02 ->  pit-03 = 605
pit-01 ->  pit-03 ->  pit-02 = 659
pit-02 ->  pit-01 ->  pit-03 = 982
pit-02 ->  pit-03 ->  pit-01 = 659
pit-03 ->  pit-02 ->  pit-01 = 605
pit-03 ->  pit-01 ->  pit-02 = 982

所以答案是

pit-01 ->  pit-02 ->  pit-03 = 605


请问各位大圣这种情况怎么处理呢。
  1. PIT-001        PIT-002        9665
  2. PIT-001        PIT-003        5794
  3. PIT-001        PIT-004        96
  4. PIT-001        PIT-005        5750
  5. PIT-001        PIT-006        6394
  6. PIT-001        PIT-007        5750
  7. PIT-001        PIT-008        3478
  8. PIT-001        PIT-009        262
  9. PIT-001        PIT-010        8954
  10. PIT-001        PIT-011        3751
  11. PIT-001        PIT-012        5253
  12. PIT-001        PIT-013        6988
  13. PIT-001        PIT-014        1364
  14. PIT-001        PIT-015        9415
  15. PIT-001        PIT-016        6156
  16. PIT-001        PIT-017        6015
  17. PIT-001        PIT-018        7931
  18. PIT-001        PIT-019        5082
  19. PIT-001        PIT-020        9891
  20. PIT-002        PIT-003        6580
  21. PIT-002        PIT-004        4325
  22. PIT-002        PIT-005        5355
  23. PIT-002        PIT-006        7221
  24. PIT-002        PIT-007        4093
  25. PIT-002        PIT-008        6098
  26. PIT-002        PIT-009        2720
  27. PIT-002        PIT-010        4662
  28. PIT-002        PIT-011        9336
  29. PIT-002        PIT-012        378
  30. PIT-002        PIT-013        4632
  31. PIT-002        PIT-014        3403
  32. PIT-002        PIT-015        6736
  33. PIT-002        PIT-016        7797
  34. PIT-002        PIT-017        5479
  35. PIT-002        PIT-018        9189
  36. PIT-002        PIT-019        1372
  37. PIT-002        PIT-020        4367
  38. PIT-003        PIT-004        9601
  39. PIT-003        PIT-005        6529
  40. PIT-003        PIT-006        1255
  41. PIT-003        PIT-007        2524
  42. PIT-003        PIT-008        5562
  43. PIT-003        PIT-009        5222
  44. PIT-003        PIT-010        998
  45. PIT-003        PIT-011        8214
  46. PIT-003        PIT-012        3623
  47. PIT-003        PIT-013        5083
  48. PIT-003        PIT-014        470
  49. PIT-003        PIT-015        6274
  50. PIT-003        PIT-016        7125
  51. PIT-003        PIT-017        6897
  52. PIT-003        PIT-018        1281
  53. PIT-003        PIT-019        9852
  54. PIT-003        PIT-020        8675
  55. PIT-004        PIT-005        6886
  56. PIT-004        PIT-006        456
  57. PIT-004        PIT-007        4762
  58. PIT-004        PIT-008        5580
  59. PIT-004        PIT-009        5893
  60. PIT-004        PIT-010        3720
  61. PIT-004        PIT-011        6098
  62. PIT-004        PIT-012        8211
  63. PIT-004        PIT-013        7543
  64. PIT-004        PIT-014        6081
  65. PIT-004        PIT-015        9590
  66. PIT-004        PIT-016        4647
  67. PIT-004        PIT-017        5801
  68. PIT-004        PIT-018        9606
  69. PIT-004        PIT-019        2766
  70. PIT-004        PIT-020        5154
  71. PIT-005        PIT-006        7815
  72. PIT-005        PIT-007        3318
  73. PIT-005        PIT-008        2698
  74. PIT-005        PIT-009        8343
  75. PIT-005        PIT-010        3150
  76. PIT-005        PIT-011        8051
  77. PIT-005        PIT-012        5387
  78. PIT-005        PIT-013        5225
  79. PIT-005        PIT-014        3237
  80. PIT-005        PIT-015        6158
  81. PIT-005        PIT-016        2743
  82. PIT-005        PIT-017        8072
  83. PIT-005        PIT-018        2154
  84. PIT-005        PIT-019        7430
  85. PIT-005        PIT-020        3015
  86. PIT-006        PIT-007        3927
  87. PIT-006        PIT-008        970
  88. PIT-006        PIT-009        5107
  89. PIT-006        PIT-010        9473
  90. PIT-006        PIT-011        771
  91. PIT-006        PIT-012        6491
  92. PIT-006        PIT-013        33
  93. PIT-006        PIT-014        5768
  94. PIT-006        PIT-015        1480
  95. PIT-006        PIT-016        2144
  96. PIT-006        PIT-017        3695
  97. PIT-006        PIT-018        8603
  98. PIT-006        PIT-019        2669
  99. PIT-006        PIT-020        4192
  100. PIT-007        PIT-008        8087
  101. PIT-007        PIT-009        3979
  102. PIT-007        PIT-010        3726
  103. PIT-007        PIT-011        2743
  104. PIT-007        PIT-012        9232
  105. PIT-007        PIT-013        217
  106. PIT-007        PIT-014        4633
  107. PIT-007        PIT-015        1088
  108. PIT-007        PIT-016        2993
  109. PIT-007        PIT-017        3154
  110. PIT-007        PIT-018        8646
  111. PIT-007        PIT-019        2484
  112. PIT-007        PIT-020        4101
  113. PIT-008        PIT-009        8297
  114. PIT-008        PIT-010        9313
  115. PIT-008        PIT-011        4124
  116. PIT-008        PIT-012        8629
  117. PIT-008        PIT-013        4267
  118. PIT-008        PIT-014        7456
  119. PIT-008        PIT-015        9067
  120. PIT-008        PIT-016        4293
  121. PIT-008        PIT-017        7649
  122. PIT-008        PIT-018        7310
  123. PIT-008        PIT-019        8391
  124. PIT-008        PIT-020        3848
  125. PIT-009        PIT-010        3381
  126. PIT-009        PIT-011        6493
  127. PIT-009        PIT-012        4667
  128. PIT-009        PIT-013        2612
  129. PIT-009        PIT-014        7146
  130. PIT-009        PIT-015        9488
  131. PIT-009        PIT-016        678
  132. PIT-009        PIT-017        8957
  133. PIT-009        PIT-018        8025
  134. PIT-009        PIT-019        1089
  135. PIT-009        PIT-020        2631
  136. PIT-010        PIT-011        4976
  137. PIT-010        PIT-012        5045
  138. PIT-010        PIT-013        5178
  139. PIT-010        PIT-014        8014
  140. PIT-010        PIT-015        5851
  141. PIT-010        PIT-016        357
  142. PIT-010        PIT-017        5471
  143. PIT-010        PIT-018        4935
  144. PIT-010        PIT-019        9617
  145. PIT-010        PIT-020        2907
  146. PIT-011        PIT-012        1515
  147. PIT-011        PIT-013        1778
  148. PIT-011        PIT-014        1773
  149. PIT-011        PIT-015        8704
  150. PIT-011        PIT-016        3318
  151. PIT-011        PIT-017        5180
  152. PIT-011        PIT-018        582
  153. PIT-011        PIT-019        9573
  154. PIT-011        PIT-020        7458
  155. PIT-012        PIT-013        6710
  156. PIT-012        PIT-014        2171
  157. PIT-012        PIT-015        9788
  158. PIT-012        PIT-016        2127
  159. PIT-012        PIT-017        7630
  160. PIT-012        PIT-018        8959
  161. PIT-012        PIT-019        5590
  162. PIT-012        PIT-020        7108
  163. PIT-013        PIT-014        9409
  164. PIT-013        PIT-015        9030
  165. PIT-013        PIT-016        3654
  166. PIT-013        PIT-017        714
  167. PIT-013        PIT-018        118
  168. PIT-013        PIT-019        7472
  169. PIT-013        PIT-020        1517
  170. PIT-014        PIT-015        890
  171. PIT-014        PIT-016        2776
  172. PIT-014        PIT-017        7240
  173. PIT-014        PIT-018        2120
  174. PIT-014        PIT-019        3314
  175. PIT-014        PIT-020        7544
  176. PIT-015        PIT-016        6725
  177. PIT-015        PIT-017        587
  178. PIT-015        PIT-018        9877
  179. PIT-015        PIT-019        1254
  180. PIT-015        PIT-020        3023
  181. PIT-016        PIT-017        9444
  182. PIT-016        PIT-018        5608
  183. PIT-016        PIT-019        3084
  184. PIT-016        PIT-020        4228
  185. PIT-017        PIT-018        7387
  186. PIT-017        PIT-019        8076
  187. PIT-017        PIT-020        6686
  188. PIT-018        PIT-019        5275
  189. PIT-018        PIT-020        816
  190. PIT-019        PIT-020        7673
复制代码

作者: tolilong    时间: 2016-05-07 15:48
本帖最后由 tolilong 于 2016-05-07 15:49 编辑

已经所有点的距离?
作者: mswsg    时间: 2016-05-07 17:20
本帖最后由 mswsg 于 2016-05-07 17:26 编辑

求大神。。!这个看了一会
一共有20个点, 要求一次经过每个点(点不重复),并且总距离最短。
已经给出任意每个点之间的距离(a,b)=x
第一个点的可能性是20,依次是19 ,18 ,... 3,2,1
。。。。。
作者: Herowinter    时间: 2016-05-07 18:17
求一条路径最短的哈密尔顿回路,这种题目用shell来解,
真的合适吗?
作者: patagonia2    时间: 2016-05-09 18:04
回复 2# tolilong


     谢谢大圣指导。
作者: patagonia2    时间: 2016-05-09 18:05
回复 3# mswsg

谢谢大神指导。
大神们什么好的代码?
   
作者: patagonia2    时间: 2016-05-09 18:08
回复 4# Herowinter


这数据量也不大,大圣来一发
谢谢大圣指导。
作者: Herowinter    时间: 2016-05-09 18:16
回复 7# patagonia2

这个问题远比你想象的复杂, 我算法没学好, 写不来.

维基百科:
寻找哈密顿路的确定算法虽然很难有多项式时间的,但是这并不意味着只能进行时间复杂度为O(n!*n)暴力搜索。
利用状态压缩动态规划,可以将时间复杂度降低到O(2^n*n^3)。
n=20, 优化算法也不简单.

你可以把这题发到一些高级语言的版块(如C++  Java)等, 看看有没有大神能帮你.
   
作者: patagonia2    时间: 2016-05-10 15:42
回复 8# Herowinter

谢谢大圣指导。
作者: lll1985911    时间: 2016-05-10 20:51
百度文库中搜了一篇文章(关于物流系统方面的)可能有点帮助。
(我没有发url的权限)

这个是较为典型的哈密尔顿回路问题。
参考A*算法和Dijkstra应该会有一些提示。
严格的说,shell不说不能做,而是shell天生并不是解决这类复杂问题的。

另外针对现代物流系统,我个人认为不能只单单考虑路径长短,货物装卸,堵车概率,海拔高低,都是影响运行成本的因素。
作者: patagonia2    时间: 2016-05-17 17:29
回复 10# lll1985911

谢谢大圣指导
   
作者: rubyish    时间: 2016-05-29 05:41
本帖最后由 rubyish 于 2017-10-01 20:16 编辑

maybe

output:

21090|20377|19194|17904|17809|16540|
MIN = 16540

PIT-005 > PIT-008 > PIT-006 > PIT-004 > PIT-001 > PIT-009 > PIT-016 > PIT-010 > PIT-003 > PIT-014 > PIT-015 > PIT-017 > PIT-013 > PIT-007 > PIT-019 > PIT-002 > PIT-012 > PIT-011 > PIT-018 > PIT-020

v1: time 2.25s
v2: time 1.35s

v2: perl abc.pl

  1. #!/usr/bin/perl -w
  2. # version 26, subversion 0 (v5.26.0)
  3. use 5.016;    # >= 5.016

  4. my @PITS;
  5. my @DISTE;
  6. my $ENDPITS;
  7. my $MIN;
  8. my @TAIL;
  9. my $PATH;

  10. explore();

  11. # ____________________SUB____________________
  12. sub init {
  13.     my %dup;
  14.     my $i = 0;
  15.     while (<DATA>) {
  16.         my ( $a, $b, $d ) = split;
  17.         $dup{$a} //= $i++;
  18.         $dup{$b} //= $i++;
  19.         push @DISTE, [ $dup{$a}, $dup{$b}, $d ];
  20.     }
  21.     @PITS  = sort { $dup{$a} <=> $dup{$b} } keys %dup;
  22.     @DISTE = sort { $a->[2] <=> $b->[2] } @DISTE;
  23.     $ENDPITS = @PITS - 1;
  24.     $MIN     = $DISTE[-1] * @PITS;
  25. }

  26. sub explore {
  27.     init();
  28.     E_( 0, 0, 0 );
  29.     say "\nMIN = $MIN\n";
  30.     echo($PATH);
  31. }

  32. sub tail {
  33.     my ( $i, $l, $tail ) = ( @_, 0 );
  34.     $tail += $DISTE[$_][2] for $i .. $i + $ENDPITS - $l - 1;
  35.     $tail;
  36. }

  37. sub E_ {
  38.     my ( $n, $b, $sum ) = @_;
  39.     state $MAYBE = [];
  40.     state $quek = [ (0) x @PITS ];

  41.     if ( $n == $ENDPITS ) {
  42.         if ( $MIN > $sum && ok($MAYBE) ) {
  43.             $MIN  = $sum;
  44.             $PATH = [@$MAYBE];
  45.             print STDERR "$MIN|";
  46.         }
  47.         return;
  48.     }

  49.     for my $i ( $b .. @DISTE - $ENDPITS + $n ) {
  50.         return if $sum + ( $TAIL[$i][$n] ||= tail( $i, $n ) ) >= $MIN;

  51.         my ( $dit, $dat ) = @{ $DISTE[$i] };

  52.         next if $quek->[$dit] > 1 || $quek->[$dat] > 1;
  53.         $quek->[$dit]++, $quek->[$dat]++;
  54.         $MAYBE->[$n] = $i;
  55.         E_( $n + 1, $i + 1, $sum + $DISTE[$i][2] );
  56.         $quek->[$dit]--, $quek->[$dat]--;
  57.     }
  58. }

  59. sub echo {
  60.     my $path = shift;
  61.     ok( $path, 1 );
  62. }

  63. sub ok {
  64.     my ( $path, $echo ) = @_;
  65.     my @that;
  66.     for my $p (@$path) {
  67.         my ( $a, $b ) = @{ $DISTE[$p] };
  68.         push @{ $that[$a] }, $b;
  69.         push @{ $that[$b] }, $a;
  70.     }

  71.     my $start;
  72.     for my $t ( 0 .. $#that ) {
  73.         return 0 if not defined $that[$t];
  74.         next if @{ $that[$t] } == 2;
  75.         $start = [$t];
  76.         last;
  77.     }

  78.     my @has;
  79.     my @these;

  80.     my $go = sub {
  81.         my $pits = shift;
  82.         for (@$pits) {
  83.             next if $has[$_];
  84.             push @these, $_;
  85.             $has[$_] = 1;
  86.             __SUB__->( $that[$_] );
  87.         }
  88.     };
  89.     $go->($start);
  90.     return @these == @PITS if !$echo;
  91.     say join ' > ', @PITS[@these];
  92. }

  93. __DATA__
  94. PIT-001 PIT-002 9665
  95. PIT-001 PIT-003 5794
  96. PIT-001 PIT-004 96
  97. PIT-001 PIT-005 5750
  98. PIT-001 PIT-006 6394
  99. PIT-001 PIT-007 5750
  100. PIT-001 PIT-008 3478
  101. PIT-001 PIT-009 262
  102. PIT-001 PIT-010 8954
  103. PIT-001 PIT-011 3751
  104. PIT-001 PIT-012 5253
  105. PIT-001 PIT-013 6988
  106. PIT-001 PIT-014 1364
  107. PIT-001 PIT-015 9415
  108. PIT-001 PIT-016 6156
  109. PIT-001 PIT-017 6015
  110. PIT-001 PIT-018 7931
  111. PIT-001 PIT-019 5082
  112. PIT-001 PIT-020 9891
  113. PIT-002 PIT-003 6580
  114. PIT-002 PIT-004 4325
  115. PIT-002 PIT-005 5355
  116. PIT-002 PIT-006 7221
  117. PIT-002 PIT-007 4093
  118. PIT-002 PIT-008 6098
  119. PIT-002 PIT-009 2720
  120. PIT-002 PIT-010 4662
  121. PIT-002 PIT-011 9336
  122. PIT-002 PIT-012 378
  123. PIT-002 PIT-013 4632
  124. PIT-002 PIT-014 3403
  125. PIT-002 PIT-015 6736
  126. PIT-002 PIT-016 7797
  127. PIT-002 PIT-017 5479
  128. PIT-002 PIT-018 9189
  129. PIT-002 PIT-019 1372
  130. PIT-002 PIT-020 4367
  131. PIT-003 PIT-004 9601
  132. PIT-003 PIT-005 6529
  133. PIT-003 PIT-006 1255
  134. PIT-003 PIT-007 2524
  135. PIT-003 PIT-008 5562
  136. PIT-003 PIT-009 5222
  137. PIT-003 PIT-010 998
  138. PIT-003 PIT-011 8214
  139. PIT-003 PIT-012 3623
  140. PIT-003 PIT-013 5083
  141. PIT-003 PIT-014 470
  142. PIT-003 PIT-015 6274
  143. PIT-003 PIT-016 7125
  144. PIT-003 PIT-017 6897
  145. PIT-003 PIT-018 1281
  146. PIT-003 PIT-019 9852
  147. PIT-003 PIT-020 8675
  148. PIT-004 PIT-005 6886
  149. PIT-004 PIT-006 456
  150. PIT-004 PIT-007 4762
  151. PIT-004 PIT-008 5580
  152. PIT-004 PIT-009 5893
  153. PIT-004 PIT-010 3720
  154. PIT-004 PIT-011 6098
  155. PIT-004 PIT-012 8211
  156. PIT-004 PIT-013 7543
  157. PIT-004 PIT-014 6081
  158. PIT-004 PIT-015 9590
  159. PIT-004 PIT-016 4647
  160. PIT-004 PIT-017 5801
  161. PIT-004 PIT-018 9606
  162. PIT-004 PIT-019 2766
  163. PIT-004 PIT-020 5154
  164. PIT-005 PIT-006 7815
  165. PIT-005 PIT-007 3318
  166. PIT-005 PIT-008 2698
  167. PIT-005 PIT-009 8343
  168. PIT-005 PIT-010 3150
  169. PIT-005 PIT-011 8051
  170. PIT-005 PIT-012 5387
  171. PIT-005 PIT-013 5225
  172. PIT-005 PIT-014 3237
  173. PIT-005 PIT-015 6158
  174. PIT-005 PIT-016 2743
  175. PIT-005 PIT-017 8072
  176. PIT-005 PIT-018 2154
  177. PIT-005 PIT-019 7430
  178. PIT-005 PIT-020 3015
  179. PIT-006 PIT-007 3927
  180. PIT-006 PIT-008 970
  181. PIT-006 PIT-009 5107
  182. PIT-006 PIT-010 9473
  183. PIT-006 PIT-011 771
  184. PIT-006 PIT-012 6491
  185. PIT-006 PIT-013 33
  186. PIT-006 PIT-014 5768
  187. PIT-006 PIT-015 1480
  188. PIT-006 PIT-016 2144
  189. PIT-006 PIT-017 3695
  190. PIT-006 PIT-018 8603
  191. PIT-006 PIT-019 2669
  192. PIT-006 PIT-020 4192
  193. PIT-007 PIT-008 8087
  194. PIT-007 PIT-009 3979
  195. PIT-007 PIT-010 3726
  196. PIT-007 PIT-011 2743
  197. PIT-007 PIT-012 9232
  198. PIT-007 PIT-013 217
  199. PIT-007 PIT-014 4633
  200. PIT-007 PIT-015 1088
  201. PIT-007 PIT-016 2993
  202. PIT-007 PIT-017 3154
  203. PIT-007 PIT-018 8646
  204. PIT-007 PIT-019 2484
  205. PIT-007 PIT-020 4101
  206. PIT-008 PIT-009 8297
  207. PIT-008 PIT-010 9313
  208. PIT-008 PIT-011 4124
  209. PIT-008 PIT-012 8629
  210. PIT-008 PIT-013 4267
  211. PIT-008 PIT-014 7456
  212. PIT-008 PIT-015 9067
  213. PIT-008 PIT-016 4293
  214. PIT-008 PIT-017 7649
  215. PIT-008 PIT-018 7310
  216. PIT-008 PIT-019 8391
  217. PIT-008 PIT-020 3848
  218. PIT-009 PIT-010 3381
  219. PIT-009 PIT-011 6493
  220. PIT-009 PIT-012 4667
  221. PIT-009 PIT-013 2612
  222. PIT-009 PIT-014 7146
  223. PIT-009 PIT-015 9488
  224. PIT-009 PIT-016 678
  225. PIT-009 PIT-017 8957
  226. PIT-009 PIT-018 8025
  227. PIT-009 PIT-019 1089
  228. PIT-009 PIT-020 2631
  229. PIT-010 PIT-011 4976
  230. PIT-010 PIT-012 5045
  231. PIT-010 PIT-013 5178
  232. PIT-010 PIT-014 8014
  233. PIT-010 PIT-015 5851
  234. PIT-010 PIT-016 357
  235. PIT-010 PIT-017 5471
  236. PIT-010 PIT-018 4935
  237. PIT-010 PIT-019 9617
  238. PIT-010 PIT-020 2907
  239. PIT-011 PIT-012 1515
  240. PIT-011 PIT-013 1778
  241. PIT-011 PIT-014 1773
  242. PIT-011 PIT-015 8704
  243. PIT-011 PIT-016 3318
  244. PIT-011 PIT-017 5180
  245. PIT-011 PIT-018 582
  246. PIT-011 PIT-019 9573
  247. PIT-011 PIT-020 7458
  248. PIT-012 PIT-013 6710
  249. PIT-012 PIT-014 2171
  250. PIT-012 PIT-015 9788
  251. PIT-012 PIT-016 2127
  252. PIT-012 PIT-017 7630
  253. PIT-012 PIT-018 8959
  254. PIT-012 PIT-019 5590
  255. PIT-012 PIT-020 7108
  256. PIT-013 PIT-014 9409
  257. PIT-013 PIT-015 9030
  258. PIT-013 PIT-016 3654
  259. PIT-013 PIT-017 714
  260. PIT-013 PIT-018 118
  261. PIT-013 PIT-019 7472
  262. PIT-013 PIT-020 1517
  263. PIT-014 PIT-015 890
  264. PIT-014 PIT-016 2776
  265. PIT-014 PIT-017 7240
  266. PIT-014 PIT-018 2120
  267. PIT-014 PIT-019 3314
  268. PIT-014 PIT-020 7544
  269. PIT-015 PIT-016 6725
  270. PIT-015 PIT-017 587
  271. PIT-015 PIT-018 9877
  272. PIT-015 PIT-019 1254
  273. PIT-015 PIT-020 3023
  274. PIT-016 PIT-017 9444
  275. PIT-016 PIT-018 5608
  276. PIT-016 PIT-019 3084
  277. PIT-016 PIT-020 4228
  278. PIT-017 PIT-018 7387
  279. PIT-017 PIT-019 8076
  280. PIT-017 PIT-020 6686
  281. PIT-018 PIT-019 5275
  282. PIT-018 PIT-020 816
  283. PIT-019 PIT-020 7673
复制代码





v1: perl abc.pl
  1. #!/usr/bin/perl

  2. my ( $ord, %ord );
  3. my @dis =
  4.   sort { $a->[1] <=> $b->[1] }
  5.   map {
  6.     my ( $a, $b, $v ) = split;
  7.     $ord{$a} //= $ord++;
  8.     $ord{$b} //= $ord++;
  9.     [ [ $ord{$a}, $ord{$b} ], $v ];
  10.   } <DATA>;

  11. my $pits = keys %ord;
  12. my $len  = $pits - 1;
  13. my @inv  = sort { $ord{$a} <=> $ord{$b} } keys %ord;
  14. my @tl   = map [ map 0, 1 .. $len ], 1 .. @dis;
  15. my ( $min, $path ) = $dis[-1][1] * $len;

  16. sub ok {
  17.     my ( $a, $r, $x ) = @_;
  18.     for my $i ( 0 .. $#$a ) {
  19.         $x = $a->[$i][0], $r = [$i], last if @{ $a->[$i] } <= 1;
  20.     }
  21.     while ( defined $x ) {
  22.         push @$r, $x;
  23.         $x = $a->[$x][ $a->[$x][0] != $r->[-2] ? 0 : 1 ];
  24.     }
  25.     @$r == $pits ? $r : ();
  26. }

  27. sub tl {
  28.     my ( $i, $l, $tl ) = ( @_, 0 );
  29.     $tl += $dis[$_][1] for $i .. $i + $len - $l - 1;
  30.     $tl;
  31. }

  32. sub go {
  33.     my ( $n, $i, $a, $l, $hd ) = @_;
  34.     if ( $n == 0 ) {
  35.         if ( my $b = ok $a ) {
  36.             $min  = $hd;
  37.             $path = $b;
  38.             print STDERR $min, '|';
  39.         }
  40.         return;
  41.     }

  42.     for my $j ( $i .. @dis - $n ) {
  43.         last if $hd + ( $tl[$j][$l] ||= tl $j, $l ) >= $min;
  44.         my ( $A, $B ) = @{ $dis[$j][0] };
  45.         next if @{ $a->[$A] } > 1 or @{ $a->[$B] } > 1;
  46.         my $b = [@$a];
  47.         $b->[$A] = [ @{ $b->[$A] }, $B ];
  48.         $b->[$B] = [ @{ $b->[$B] }, $A ];
  49.         go( $n - 1, $j + 1, $b, $l + 1, $hd + $dis[$j][1] );
  50.     }
  51. }

  52. my @now = ( $len, 0, [ map [], 0 .. $len ], 0, 0 );
  53. go @now;
  54. print "\nmin = ", $min, $/;
  55. print join( ' > ', @inv[@$path] ), $/;

  56. __DATA__
  57. PIT-001 PIT-002 9665
  58. PIT-001 PIT-003 5794
  59. PIT-001 PIT-004 96
  60. PIT-001 PIT-005 5750
  61. PIT-001 PIT-006 6394
  62. PIT-001 PIT-007 5750
  63. PIT-001 PIT-008 3478
  64. PIT-001 PIT-009 262
  65. PIT-001 PIT-010 8954
  66. PIT-001 PIT-011 3751
  67. PIT-001 PIT-012 5253
  68. PIT-001 PIT-013 6988
  69. PIT-001 PIT-014 1364
  70. PIT-001 PIT-015 9415
  71. PIT-001 PIT-016 6156
  72. PIT-001 PIT-017 6015
  73. PIT-001 PIT-018 7931
  74. PIT-001 PIT-019 5082
  75. PIT-001 PIT-020 9891
  76. PIT-002 PIT-003 6580
  77. PIT-002 PIT-004 4325
  78. PIT-002 PIT-005 5355
  79. PIT-002 PIT-006 7221
  80. PIT-002 PIT-007 4093
  81. PIT-002 PIT-008 6098
  82. PIT-002 PIT-009 2720
  83. PIT-002 PIT-010 4662
  84. PIT-002 PIT-011 9336
  85. PIT-002 PIT-012 378
  86. PIT-002 PIT-013 4632
  87. PIT-002 PIT-014 3403
  88. PIT-002 PIT-015 6736
  89. PIT-002 PIT-016 7797
  90. PIT-002 PIT-017 5479
  91. PIT-002 PIT-018 9189
  92. PIT-002 PIT-019 1372
  93. PIT-002 PIT-020 4367
  94. PIT-003 PIT-004 9601
  95. PIT-003 PIT-005 6529
  96. PIT-003 PIT-006 1255
  97. PIT-003 PIT-007 2524
  98. PIT-003 PIT-008 5562
  99. PIT-003 PIT-009 5222
  100. PIT-003 PIT-010 998
  101. PIT-003 PIT-011 8214
  102. PIT-003 PIT-012 3623
  103. PIT-003 PIT-013 5083
  104. PIT-003 PIT-014 470
  105. PIT-003 PIT-015 6274
  106. PIT-003 PIT-016 7125
  107. PIT-003 PIT-017 6897
  108. PIT-003 PIT-018 1281
  109. PIT-003 PIT-019 9852
  110. PIT-003 PIT-020 8675
  111. PIT-004 PIT-005 6886
  112. PIT-004 PIT-006 456
  113. PIT-004 PIT-007 4762
  114. PIT-004 PIT-008 5580
  115. PIT-004 PIT-009 5893
  116. PIT-004 PIT-010 3720
  117. PIT-004 PIT-011 6098
  118. PIT-004 PIT-012 8211
  119. PIT-004 PIT-013 7543
  120. PIT-004 PIT-014 6081
  121. PIT-004 PIT-015 9590
  122. PIT-004 PIT-016 4647
  123. PIT-004 PIT-017 5801
  124. PIT-004 PIT-018 9606
  125. PIT-004 PIT-019 2766
  126. PIT-004 PIT-020 5154
  127. PIT-005 PIT-006 7815
  128. PIT-005 PIT-007 3318
  129. PIT-005 PIT-008 2698
  130. PIT-005 PIT-009 8343
  131. PIT-005 PIT-010 3150
  132. PIT-005 PIT-011 8051
  133. PIT-005 PIT-012 5387
  134. PIT-005 PIT-013 5225
  135. PIT-005 PIT-014 3237
  136. PIT-005 PIT-015 6158
  137. PIT-005 PIT-016 2743
  138. PIT-005 PIT-017 8072
  139. PIT-005 PIT-018 2154
  140. PIT-005 PIT-019 7430
  141. PIT-005 PIT-020 3015
  142. PIT-006 PIT-007 3927
  143. PIT-006 PIT-008 970
  144. PIT-006 PIT-009 5107
  145. PIT-006 PIT-010 9473
  146. PIT-006 PIT-011 771
  147. PIT-006 PIT-012 6491
  148. PIT-006 PIT-013 33
  149. PIT-006 PIT-014 5768
  150. PIT-006 PIT-015 1480
  151. PIT-006 PIT-016 2144
  152. PIT-006 PIT-017 3695
  153. PIT-006 PIT-018 8603
  154. PIT-006 PIT-019 2669
  155. PIT-006 PIT-020 4192
  156. PIT-007 PIT-008 8087
  157. PIT-007 PIT-009 3979
  158. PIT-007 PIT-010 3726
  159. PIT-007 PIT-011 2743
  160. PIT-007 PIT-012 9232
  161. PIT-007 PIT-013 217
  162. PIT-007 PIT-014 4633
  163. PIT-007 PIT-015 1088
  164. PIT-007 PIT-016 2993
  165. PIT-007 PIT-017 3154
  166. PIT-007 PIT-018 8646
  167. PIT-007 PIT-019 2484
  168. PIT-007 PIT-020 4101
  169. PIT-008 PIT-009 8297
  170. PIT-008 PIT-010 9313
  171. PIT-008 PIT-011 4124
  172. PIT-008 PIT-012 8629
  173. PIT-008 PIT-013 4267
  174. PIT-008 PIT-014 7456
  175. PIT-008 PIT-015 9067
  176. PIT-008 PIT-016 4293
  177. PIT-008 PIT-017 7649
  178. PIT-008 PIT-018 7310
  179. PIT-008 PIT-019 8391
  180. PIT-008 PIT-020 3848
  181. PIT-009 PIT-010 3381
  182. PIT-009 PIT-011 6493
  183. PIT-009 PIT-012 4667
  184. PIT-009 PIT-013 2612
  185. PIT-009 PIT-014 7146
  186. PIT-009 PIT-015 9488
  187. PIT-009 PIT-016 678
  188. PIT-009 PIT-017 8957
  189. PIT-009 PIT-018 8025
  190. PIT-009 PIT-019 1089
  191. PIT-009 PIT-020 2631
  192. PIT-010 PIT-011 4976
  193. PIT-010 PIT-012 5045
  194. PIT-010 PIT-013 5178
  195. PIT-010 PIT-014 8014
  196. PIT-010 PIT-015 5851
  197. PIT-010 PIT-016 357
  198. PIT-010 PIT-017 5471
  199. PIT-010 PIT-018 4935
  200. PIT-010 PIT-019 9617
  201. PIT-010 PIT-020 2907
  202. PIT-011 PIT-012 1515
  203. PIT-011 PIT-013 1778
  204. PIT-011 PIT-014 1773
  205. PIT-011 PIT-015 8704
  206. PIT-011 PIT-016 3318
  207. PIT-011 PIT-017 5180
  208. PIT-011 PIT-018 582
  209. PIT-011 PIT-019 9573
  210. PIT-011 PIT-020 7458
  211. PIT-012 PIT-013 6710
  212. PIT-012 PIT-014 2171
  213. PIT-012 PIT-015 9788
  214. PIT-012 PIT-016 2127
  215. PIT-012 PIT-017 7630
  216. PIT-012 PIT-018 8959
  217. PIT-012 PIT-019 5590
  218. PIT-012 PIT-020 7108
  219. PIT-013 PIT-014 9409
  220. PIT-013 PIT-015 9030
  221. PIT-013 PIT-016 3654
  222. PIT-013 PIT-017 714
  223. PIT-013 PIT-018 118
  224. PIT-013 PIT-019 7472
  225. PIT-013 PIT-020 1517
  226. PIT-014 PIT-015 890
  227. PIT-014 PIT-016 2776
  228. PIT-014 PIT-017 7240
  229. PIT-014 PIT-018 2120
  230. PIT-014 PIT-019 3314
  231. PIT-014 PIT-020 7544
  232. PIT-015 PIT-016 6725
  233. PIT-015 PIT-017 587
  234. PIT-015 PIT-018 9877
  235. PIT-015 PIT-019 1254
  236. PIT-015 PIT-020 3023
  237. PIT-016 PIT-017 9444
  238. PIT-016 PIT-018 5608
  239. PIT-016 PIT-019 3084
  240. PIT-016 PIT-020 4228
  241. PIT-017 PIT-018 7387
  242. PIT-017 PIT-019 8076
  243. PIT-017 PIT-020 6686
  244. PIT-018 PIT-019 5275
  245. PIT-018 PIT-020 816
  246. PIT-019 PIT-020 7673
复制代码

作者: 523066680    时间: 2021-10-10 14:10
回复 12# rubyish

Hi Rubyish你的邮箱是多少? 或者有QQ/微信之类的联系方式吗?





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2