|
Revision 18, 0.8 KB
(checked in by yabuki, 3 years ago)
|
|
|
| Line | |
|---|
| 1 | DROP FUNCTION shortestPath(); |
|---|
| 2 | |
|---|
| 3 | CREATE FUNCTION shortestPath() RETURNS void AS ' |
|---|
| 4 | DECLARE |
|---|
| 5 | maxLength INT:=1; |
|---|
| 6 | oldSize INT; |
|---|
| 7 | newSize INT:=0; |
|---|
| 8 | BEGIN |
|---|
| 9 | INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges; |
|---|
| 10 | |
|---|
| 11 | LOOP |
|---|
| 12 | INSERT INTO paths |
|---|
| 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 | AND NOT EXISTS ( |
|---|
| 19 | SELECT * FROM paths q |
|---|
| 20 | WHERE q.startNode=p.startNode AND q.endNode=tail); |
|---|
| 21 | maxLength:=maxLength+1; |
|---|
| 22 | oldSize:=newSize; |
|---|
| 23 | SELECT COUNT(*) INTO newSize FROM paths; |
|---|
| 24 | IF oldSize=newSize THEN |
|---|
| 25 | EXIT; |
|---|
| 26 | END IF; |
|---|
| 27 | END LOOP; |
|---|
| 28 | END; |
|---|
| 29 | ' LANGUAGE plpgsql; |
|---|
| 30 | |
|---|
| 31 | TRUNCATE TABLE paths; -- こうした方が速い |
|---|
| 32 | |
|---|
| 33 | SELECT shortestPath(); |
|---|