|
Revision 18, 0.8 KB
(checked in by yabuki, 3 years ago)
|
|
|
| Line | |
|---|
| 1 | CREATE OR REPLACE PROCEDURE shortestPath IS |
|---|
| 2 | BEGIN |
|---|
| 3 | DECLARE |
|---|
| 4 | maxLength INT:=1; |
|---|
| 5 | oldSize INT; |
|---|
| 6 | newSize INT:=0; |
|---|
| 7 | BEGIN |
|---|
| 8 | INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges; |
|---|
| 9 | |
|---|
| 10 | LOOP |
|---|
| 11 | INSERT INTO paths |
|---|
| 12 | SELECT DISTINCT p.startNode AS startNode,tail AS endNode,maxLength+1 AS length |
|---|
| 13 | FROM paths p |
|---|
| 14 | JOIN edges ON p.endNode=head |
|---|
| 15 | WHERE p.length=maxLength |
|---|
| 16 | AND p.startNode!=tail |
|---|
| 17 | AND NOT EXISTS ( |
|---|
| 18 | SELECT * FROM paths q |
|---|
| 19 | WHERE q.startNode=p.startNode AND q.endNode=tail); |
|---|
| 20 | maxLength:=maxLength+1; |
|---|
| 21 | oldSize:=newSize; |
|---|
| 22 | SELECT COUNT(*) INTO newSize FROM paths; |
|---|
| 23 | EXIT WHEN oldSize=newSize; |
|---|
| 24 | END LOOP; |
|---|
| 25 | END; |
|---|
| 26 | END; |
|---|
| 27 | / |
|---|
| 28 | |
|---|
| 29 | TRUNCATE TABLE paths; -- こうした方が速い |
|---|
| 30 | |
|---|
| 31 | CALL shortestPath(); |
|---|