2. 訪問経路の列挙
次は、枝切りを使った問題を解いてみましょう。
ID | Next1 | Next2 | Next3 |
A | B | C | null |
B | D | G | null |
C | D | E | null |
D | E | F | G |
E | C | D | F |
F | D | E | G |
G | B | D | F |
下記の有向グラフでAからDに到着する経路を求めます。ただし、同じノードへの再訪は不許可とします。
答えは下記となります。Dに到着したら探索を打ち切るということで、connect by
句でprior ID != 'D'
を指定しています。そして、where ID = 'D'
を指定して、Dまでの経路を列挙しています。
select Level,sys_connect_by_path(ID,',') as path from NodeT where ID = 'D' start with ID = 'A' connect by nocycle ID in(prior Next1, prior Next2, prior Next3) and prior ID != 'D';
Level | path |
3 | ,A,B,D |
4 | ,A,B,G,D |
5 | ,A,B,G,F,D |
7 | ,A,B,G,F,E,C,D |
6 | ,A,B,G,F,E,D |
3 | ,A,C,D |
4 | ,A,C,E,D |
5 | ,A,C,E,F,D |
7 | ,A,C,E,F,G,B,D |
6 | ,A,C,E,F,G,D |