Problem:
サージェント・ライアン

「ライアン軍曹を救え」という指令のもと、アイヅ軍の救出部隊はドイツリーの水上都市で敵軍と激しい戦闘を繰り広げていました。彼らは無事に軍曹と合流しましたが、敵の戦車が多く、救出ヘリを呼べずにいました。そこで、彼らは敵の戦車を混乱させるため、都市にある橋を全て爆破するという作戦を実行することにしました。

作戦はすぐに司令部に伝えられ、救出ヘリの準備が進められました。救出ヘリを飛ばすためには、いつ橋が全て爆破されるかを予測しなければなりません。軍のプログラマであるあなたの任務は、救出部隊が全ての橋の爆破に必要な時間を計算することです。

水上都市は N 個の島で構成されており、島と島との間には橋がかかっています。すべての島はツリー状に繋がっています(下図参照) 。ある島からある島への経路は、一通りだけ存在します。各橋を渡るには、橋ごとに決められた時間がかかり、どちらの方向にもその時間で橋を渡ることが可能です。

救出部隊はボートなど水上を移動する手段を持っていないので島と島の間を移動するには橋を通る他ありません。救出部隊は、その時いる島に隣接している橋のうち、必要なものを一瞬で爆破することができます。救出部隊が全ての橋を爆破するのに必要な最小の時間はいくらでしょうか。ただし、島の中での移動時間は考えません。

島の数、それぞれの橋情報を入力とし、橋を全て爆破するのに必要な最小の時間を出力するプログラムを作成してください。島はそれぞれ 1 から N の番号で表されます。橋は N-1 本あります。橋情報は、その橋が隣接している二つの島の番号(a, b)と、その橋を渡るのに必要な時間 t で構成されます。救出部隊は島番号 1 の島からスタートするものとします。

Input

複数のデータセットの並びが入力として与えられる。入力の終わりはゼロひとつの行で示される。各データセットは以下の形式で与えられる。

N
a1 b1 t1
a2 b2 t2
:
aN-1 bN-1 tN-1

入力はすべて整数で与えられる。1 行目に島の数 N (2 ≤ N ≤ 20) が与えられる。

続く N-1 行に i 番目の橋の情報が与えられる。 ai, bi, ti (1 ≤ ti ≤ 500) は、i 番目の橋を通って島 ai と島 bi の間を時間 ti で移動できることを表す。

データセットの数は 100 を超えない。

Output

データセットごとに、橋を全て爆破するのに必要な最小の時間を1行に出力する。

Sample Input

7
1 2 5
2 3 2
3 4 3
2 5 3
5 6 3
5 7 8
0

Output for the Sample Input

12

Solution in PHP (judge verdict: Wrong Answer)

<?php
//$sum_distは常にプラスされていく。マイナスされることは無い
//子ノードに移った時に、親ノードとの距離を$dist['parent']['child']ではかり$sum_distに+=
//最初に、全ての橋の$dist['parent']['child']を計算、記録しておく。
//孫ノードが存在しなければ、その子ノードはスタックに追加しない。
//最初に全ての島について、$island[$num] = false; を入れておく
//孫ノードが存在しなければ、$island[子ノードのnum] = true; を入れる（爆破可能なので）
//全ての島について true になったら終了。そのときの$sum_distを出力
//橋を渡り返す時、つまり『孫ノードが存在しない時』、親ノードとの距離を測り$sum_distに+=

//ルートが複数ある場合、どう判断するか

$file_handle = fopen('php://stdin', "r");	//fopen()は同位フォルダにファイルがあればその名前のみでOK
//$file_handle = fopen('aoj0235_in.txt', "r");

//dfs（再帰を利用しないver, スタック利用）
function dfs() {
	//グローバル変数定義
	global $n;
	global $island;
	global $sum_dist;
	global $dist;
	global $flag;
	
	$parentnode = 0;			//親ノード
	$stack[0] = 1;		//スタートを$stackに入れて開始
	while (!empty($stack)) {		//$stackが1つ以上あればループ
	   $cur = array_pop($stack);	//$stackの『尻』から１つ取り出す。$cur は配列なので注意
	   $island[$cur] = true;		//現在の島を探索済みに追加
	   
	   //var_dump ($cur);
	   
	   if (!empty($dist[$parentnode][$cur])){
	       $sum_dist += $dist[$parentnode][$cur];
	   }
	   	   
	   //数字の大きい島のみ子ノードとして取り出す
	   $childnode = childnode($cur);
	   foreach ($childnode as $island_num => $distance) {
		   //数字の大きい島のみ孫ノードとして取り出す
		   $grandchildnode = childnode($island_num);
	       if (!empty($grandchildnode)) {
	       		$new = $island_num;
	    		array_push($stack, $new);
	    		$parentnode = $cur;
	       } else {
	        	$island[$island_num] = true;		//孫ノードが無い子ノードを爆破
	       }
	   }
	   
	   //終了条件
	    $cnt = 0;
	    for ($i=1; $i<=$n; $i++){
	       if ( $island[$i] === false ){
	           break;
	       }
	       $cnt++;
	    }
	    if ($cnt === $n){
	       $flag = 1;
	       break;
	    }
	   
	   //孫ノードが無い且つゴールしてない且つ親が存在するならば、来た道を戻る
	   if (empty($grandchildnode) && !empty($dist[$parentnode][$cur])){
	       $sum_dist += $dist[$parentnode][$cur];
	   }
	   
	}
}

//子ノード抽出
function childnode($island){
	global $dist;
   //数字の大きい島のみ子ノードとして取り出す
   $childnode = array();
   if (!empty($dist[$island])){
	   foreach ($dist[$island] as $key => $val){
	       if ($island < $key){
	       		$childnode[$key] = $val;
	       }
	   }
   }
   //バグ修正ポイント。ノード間距離が大きい順に並べ替える。sort()はval昇順。rsort()はval降順。arsort()はkeyとvalの対応関係を保ったまま降順ソート
   //（スタックで尻から使うので実際は距離が小さい順に探索することとなる）
   arsort($childnode);
   return $childnode;
}


while (1){
	//変数の初期化
	$island = array();
	$sum_dist = 0;
	$flag = 0;
	$island = array();

	//ファイル読み込み
	$stdin = fscanf($file_handle, '%d');	//fscanf()で読み込んだものは配列として格納される
	$n = $stdin[0];
	//終了条件
	if ($n === 0){
		break;
	}
	
	for ($i=0; $i < $n-1; $i++){
		$info = fscanf($file_handle, '%d %d %d');
		$parent = $info[0]; $child = $info[1]; $distance = $info[2];
		if ($parent < $child){
			$dist[$parent][$child] = $distance;
		} else {
			$dist[$child][$parent] = $distance;
		}
	}
	for ($i=1; $i<=$n; $i++){
		//全ての島についてfalseを入れる。
		$island[$i] = false;
	}

	//探索
	dfs();

	//出力
	if ($flag === 1){
		echo $sum_dist;
	} else {
		echo 'ERROR';
	}
	echo PHP_EOL;
}

fclose($file_handle);