root/trunk/sql/mysql/shortestPath.sql

Revision 18, 0.8 KB (checked in by yabuki, 3 years ago)
Line 
1DROP PROCEDURE IF EXISTS shortestPath;
2
3DELIMITER //
4CREATE PROCEDURE shortestPath()
5BEGIN
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;
24END//
25DELIMITER ;
26
27TRUNCATE TABLE paths;
28
29CALL shortestPath();
Note: See TracBrowser for help on using the browser.