トップページに戻る    次の再帰with句のサンプルへ    前の再帰with句のサンプルへ

再帰with句08 最小全域木問題

SQLパズル

最小全域木を求める。

問題


答え


データ作成スクリプト

create table minTree(
ID     char(1),
nextID char(1),
cost   number);

insert into minTree values('A','B',5);
insert into minTree values('A','C',2);
insert into minTree values('B','C',4);
insert into minTree values('B','D',2);
insert into minTree values('C','D',3);
insert into minTree values('C','E',2);
insert into minTree values('D','E',6);
insert into minTree values('D','F',6);
insert into minTree values('E','F',4);

insert into minTree
select nextID,ID,cost from minTree;
commit;


SQL

col path for a30

with rec(LV,ID,NextID,cost,path) as(
select 1,ID,nextID,cost,
cast('(' || ID || nextID || ')' as varchar2(100))
  from minTree
 where ID = 'A'
union all
select a.LV+1,b.ID,b.nextID,
case when instr(a.path,b.ID || b.nextID) > 0
       or instr(a.path,b.nextID || b.ID) > 0
     then a.cost else a.cost+b.cost end,
a.path || '(' || b.ID || b.nextID || ')'
  from rec a,minTree b
 where a.nextID = b.ID
   and a.cost < 5+2+4+2+3+2+6+6+4
   and a.LV <= 10)
select cost,path
  from (select cost,path,rank() over(order by cost,LV) as rn
          from rec
         where path like '%A%' and path like '%B%'
           and path like '%C%' and path like '%D%'
           and path like '%E%' and path like '%F%')
 where rn=1;


解説

階層問い合わせでは、同じノードに再訪できませんが、
再帰with句では、同じノードに再訪できるのです。