1 <?php 2 #有n個字串,每個數組長度m+1,如果數組的後m個元素和另一個數組的前m個元素相同,則兩個數組可以相連 3 #求n個數組中串連起來的最長路徑是多少,如果遇到環路則報錯退出 4 5 function longest($a, $m) { 6 $len = count($a); 7 #把二維數組$a的每個字串元素看成一個節點 8 #建立節點之間的聯通關係數組g,g[i][j]代表節點ij之間的最長路徑 9 10 #初始化g,講可連通的節點值設為111 $g = array();12 for ($i = 0; $i < $len; $i++) {13 for ($j = 0; $j < $len; $j++) {14 $lastm = substr($a[$i], 1);15 $firstm = substr($a[$j], 0, $m);16 if ($lastm == $firstm) {17 $g[$i][$j] = 1;18 } else {19 $g[$i][$j] = 0;20 }21 }22 }23 24 #使用弗洛伊德演算法計算最長的路徑25 for ($k = 0; $k < $len; $k++) {26 for ($i = 0; $i < $len; $i++) {27 for ($j= 0; $j < $len; $j++) {28 if ($g[$i][$k] > 0 && $g[$k][$j] > 0) {29 $dist = $g[$i][$k] + $g[$k][$j];30 if ($dist > $g[$i][$j]) {31 $g[$i][$j] = $dist;32 }33 }34 }35 }36 }37 38 #檢測環路39 #環路包括兩種,一種是i->i自己到自己,另一種是,i->...->k->...->i40 for ($i = 0; $i < $len; $i++) {41 if ($g[$i][$i] >= 1) die("There is a circle");42 }43 44 #求出最長路徑45 $max = 0;46 for ($i = 0; $i < $len; $i++) {47 $max = max(max($g[$i]), $max);48 }49 50 return $max;51 }52 53 $a = array(54 "abcd", 55 "bcde", 56 "cdea", 57 "deab", 58 "eaba", 59 "abab", 60 "deac", 61 "cdei", 62 "bcdf", 63 "cdfi", 64 "dfic", 65 "cdfk", 66 "bcdg",67 );68 69 print_r(longest($a, 3));70 ?>