|
Revision 18, 0.8 KB
(checked in by yabuki, 3 years ago)
|
|
|
| Line | |
|---|
| 1 | DROP PROCEDURE IF EXISTS shortestPath; |
|---|
| 2 | |
|---|
| 3 | DELIMITER // |
|---|
| 4 | CREATE PROCEDURE shortestPath() |
|---|
| 5 | BEGIN |
|---|
| 6 | DECLARE maxLength INT DEFAULT 1; |
|---|
| 7 | DECLARE newSize,oldSize INT DEFAULT 0; |
|---|
| 8 | |
|---|
| 9 | INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges; |
|---|
| 10 | |
|---|
| 11 | REPEAT |
|---|
| 12 | INSERT IGNORE INTO paths -- pathsのendNodeから1歩進む |
|---|
| 13 | SELECT DISTINCT p.startNode AS startNode,tail AS endNode,maxLength+1 AS length |
|---|
| 14 | FROM paths p |
|---|
| 15 | JOIN edges ON p.endNode=head |
|---|
| 16 | WHERE p.length=maxLength |
|---|
| 17 | AND p.startNode!=tail; |
|---|
| 18 | |
|---|
| 19 | SET maxLength=maxLength+1; |
|---|
| 20 | SET oldSize=newSize; |
|---|
| 21 | SELECT COUNT(*) INTO newSize FROM paths; |
|---|
| 22 | UNTIL oldSize=newSize -- テーブルpathsが変わらなくなるまで繰り返す |
|---|
| 23 | END REPEAT; |
|---|
| 24 | END// |
|---|
| 25 | DELIMITER ; |
|---|
| 26 | |
|---|
| 27 | TRUNCATE TABLE paths; |
|---|
| 28 | |
|---|
| 29 | CALL shortestPath(); |
|---|