|
Revision 18, 1.0 KB
(checked in by yabuki, 3 years ago)
|
|
|
| Line | |
|---|
| 1 | IF EXISTS ( |
|---|
| 2 | SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'dbo.shortestPath') |
|---|
| 3 | AND OBJECTPROPERTY(id, N'IsProcedure') = 1) |
|---|
| 4 | DROP PROCEDURE shortestPath |
|---|
| 5 | GO |
|---|
| 6 | |
|---|
| 7 | CREATE PROCEDURE shortestPath AS |
|---|
| 8 | BEGIN |
|---|
| 9 | DECLARE |
|---|
| 10 | @maxLength INT, |
|---|
| 11 | @oldSize INT, |
|---|
| 12 | @newSize INT |
|---|
| 13 | SET @maxLength=1 |
|---|
| 14 | SET @oldSize=0 |
|---|
| 15 | SET @newSize=1 |
|---|
| 16 | |
|---|
| 17 | INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges |
|---|
| 18 | |
|---|
| 19 | WHILE @oldSize!=@newSize |
|---|
| 20 | BEGIN |
|---|
| 21 | INSERT INTO paths |
|---|
| 22 | SELECT DISTINCT p.startNode AS startNode,tail AS endNode,@maxLength+1 AS length |
|---|
| 23 | FROM paths p |
|---|
| 24 | JOIN edges ON p.endNode=head |
|---|
| 25 | WHERE p.length=@maxLength |
|---|
| 26 | AND p.startNode!=tail |
|---|
| 27 | AND NOT EXISTS ( |
|---|
| 28 | SELECT * FROM paths q |
|---|
| 29 | WHERE q.startNode=p.startNode AND q.endNode=tail) |
|---|
| 30 | |
|---|
| 31 | SET @maxLength=@maxLength+1 |
|---|
| 32 | SET @oldSize=@newSize |
|---|
| 33 | SET @newSize=(SELECT COUNT(*) FROM paths) |
|---|
| 34 | END |
|---|
| 35 | END |
|---|
| 36 | GO |
|---|
| 37 | |
|---|
| 38 | TRUNCATE TABLE paths -- こうした方が速い |
|---|
| 39 | GO |
|---|
| 40 | |
|---|
| 41 | EXECUTE shortestPath |
|---|