このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1086272325/886
#  木に一本だけ辺をつけ加えて最長となる閉路を探すアルゴリズム
# 

木に一本だけ辺をつけ加えて最長となる閉路を探す(_根,_辺起点,_辺終点) :-
        findall([_深さ,_葉に至る経路],(
                    葉を捜す(_根,_葉に至る経路),
                    length(_葉に至る経路,_深さ)),
                LL1),
        sort(LL1,LL2),
        reverse(LL2,LL3),
        一本辺をつけ加えて閉路とする(LL3,_辺起点,_辺終点).

葉を捜す(_根,[_根|R]) :-
        木(_根,_葉),
        葉を捜す(_葉,R).
葉を捜す(_根,[]).


一本辺をつけ加えて閉路とする([[N,L1],[N,L2]|R],_辺起点,_辺終点) :-
        findall(_葉,(
                    member([N,L],[[N,L1],[N,L2]|R]),
                    last(L,_葉)),
                _葉ならび),
        組合せ(_葉ならび,2,[_辺起点,_辺終点]).
一本辺をつけ加えて閉路とする([[N1,L1],[N2,L2]|R],_辺起点,_辺終点) :-
        \+(N1 = N2),
        last(L1,_辺起点),
        member([N2,L],[[N2,L2]|R]),
        last(L,_辺終点).