(57)【特許請求の範囲】
【請求項１】
コンピュータに、
複数の頂点と頂点間を結ぶ辺とで表された重みなしグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する
ことを含む処理を実行させる生成方法。
【請求項２】
前記第２の最短経路木に含まれる頂点の子を探索することにより生成された前記第１の最短経路木に含まれる頂点に、前記第２の最短経路木に含まれる頂点の子を示す属性を付与し、
前記属性が付与された頂点が前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点となった際に、前記子に相当する頂点を示す属性が示す頂点を、前記第２の最短経路木に含まれる頂点とする
請求項１記載の生成方法。
【請求項３】
前記グラフが重みなし有向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点から出た辺が入る頂点とする請求項１又は請求項２記載の生成方法。
【請求項４】
前記グラフが重みなし無向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点と辺で結ばれた頂点とする請求項１又は請求項２記載の生成方法。
【請求項５】
複数の頂点と頂点間を結ぶ辺とで表された重みなしグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する生成部を含む生成装置。
【請求項６】
コンピュータに、
複数の頂点と頂点間を結ぶ辺とで表された重みなしグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する
ことを含む処理を実行させるための生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、生成方法、生成装置、及び生成プログラムに関する。
【背景技術】
【０００２】
近年、ＳＮＳ（Social Networking Service）、顧客関係管理、ネットワーク管理、バイオエンジニアリング、輸送などの分野で、ネットワーク的データを活用するアプリケーションが増えてきている。ネットワーク的データは、各要素と、要素間の関係とを表すデータである。例えば、インターネット、通信網、交通網、輸送網などのいわゆるネットワークや、人間関係、分子間の関係などを表すデータがある。
【０００３】
また、ネットワーク的データは、各要素に対応する頂点（vertex）と、関係する要素間に対応する頂点間を結ぶ辺（edge）とを含むグラフで表すことができる。例えば、人間関係を表すネットワーク的データのグラフは、一人の人間を一つの要素として頂点で表し、人間同士の関係を、頂点間を結ぶ辺として表すことができる。
【０００４】
なお、グラフＧに含まれる頂点の集合をＶ、辺の集合をＥとすると、グラフＧは、Ｇ＝（Ｖ，Ｅ）と表すことができる。また、グラフにおいて、１つの辺で結ばれた２つの頂点は、「隣接している（adjacent）」という。また、頂点の列ｖ０，ｖ１，・・・，ｖｎにおいて、任意のｉ（１≦ｉ≦ｎ）に対して、頂点ｖｉ−１と頂点ｖｉとが隣接している場合、この頂点の列を経路（パス）と呼び、その長さはｎである。また、頂点ｖ０を経路の「始点」、頂点ｖｎを経路の「終点」と呼ぶ。また、２頂点間の経路のうち、長さが最も短い経路を最短経路といい、２頂点間の最短経路の長さを距離という。  
【０００５】
また、上記のようなグラフには、辺に向きがない無向グラフと、辺に向きがある有向グラフとがある。例えば、道路が全て両方向から通行可能であれば、道路網を無向グラフで表現できる。しかし、一方通行の道路を含む道路網は、有向グラフでないと表現できない。なお、上記の各定義は、無向グラフを前提にしている。
【０００６】
また、上記のようなネットワーク的データのグラフには、各辺に重みが付与された重み付きグラフと、各辺に重みが付与されていない重みなしグラフとがある。例えば、線路網は、各駅を頂点に対応させ、隣り合う駅同士に対応する頂点間を辺で結び、駅間の距離に応じた重みを各辺に付与することで、重み付きグラフとして表現できる。一方、人間関係を表すネットワーク的データにおいて、関係の有無のみに着目し、関係の親密さは問わない場合、人間関係は重みなしグラフで表現できることになる。なお、重みは正の値だけではなく、負の値も付与することが可能である。
【０００７】
一方、ネットワーク的データの中からビジネス、経営、研究などに重要な情報を抽出するなどのデータ分析に対するニーズが高まっている。ネットワーク的データを表すグラフに対するデータ分析も同様にニーズがある。例えば、グラフにおいて、２頂点間の最短経路を求めることは、グラフに対するデータ分析として重要である。
【０００８】
以下に重みなし無向グラフが有効な３つの例を挙げる。例えば、人間関係を表すネットワーク的データでは、ＳＮＳにおいて友人関係にある人間同士や、社内でメールのやり取りを行なっている人間同士などを辺で結んだグラフが考えられる。このグラフ中に頂点として表されているある人から、その人とは直接の関係はない別の人にアクセスしたい場合を考える。この場合、グラフにおいて、二人を表す頂点間の最短経路がわかれば、最も少ない手間で、経路上に存在する頂点に対応する知人を通して、目的とする人にコンタクトを取ることができる。
【０００９】
また、コンピュータネットワークを表すグラフでは、頂点間の最短経路がわかれば、頂点に対応する装置間において、通信回数が最小の経路で通信を行なうことが可能となる。
【００１０】
また、例えば、ルービックキューブ（登録商標）の各局面を頂点、１つの回転で遷移できる局面同士を辺で結ぶグラフを考える。この場合、ある局面に対応する頂点から、最終局面（全ての面が１色のみの状態）に対応する頂点までの最短経路は、最適（最小手数の）解を示すことになる。
【００１１】
従来、上述のようなグラフ内の頂点間の最短経路を求める技術として、グラフにおける頂点間の最短経路を最短経路木として表現する方法、重みつきグラフの最短経路を求める各方式、及び重みなしグラフの最短経路を求める各方式が提案されている。
【００１２】
まず、最短経路を最短経路木として表現する方法について説明する。ある頂点ｖからｖ以外の全ての頂点への最短経路は、最短経路木として表現することが可能であることが知られている。
【００１３】
ここで、グラフに含まれる一部の頂点及び辺を含むグラフを部分グラフという。部分グラフの頂点の集合は元のグラフの頂点の部分集合であり、部分グラフの辺の集合も元のグラフの辺の集合の部分集合となる。また、部分グラフ内の任意の２頂点について、一方から他方への経路がある場合、その部分グラフは連結であるという。また、始点と終点とが一致した経路を閉路という。
【００１４】
上記の定義によれば、木とは、閉路を含まない連結部分グラフということができる。一般的に、木に含まれる頂点数をｎとした場合、木に含まれる辺の数はｎ−１である。また、木は、ある頂点を一番上に、それに繋がる頂点（群）をその下に、さらにその頂点（群）に繋がる頂点をその下に、・・・というように、木を逆にしたような形に書くことができる。この場合、一番上の頂点を「根」と呼ぶ。また、その頂点より下に頂点が存在しない頂点を「葉」と呼ぶ。また、ある頂点ｖのすぐ下に繋がる頂点ｗを頂点ｖの子、頂点ｖを頂点ｗの親と呼ぶ。さらに、葉から根までの距離のうち最大のものを木の深さと呼ぶ。なお、木においては、葉から根までの経路はユニークに決まる。
【００１５】
上記の頂点ｖから全ての頂点への最短経路を表す最短経路木を「頂点ｖを根とする最短経路木」と呼び、Ｔ（ｖ）と表す。言い換えれば、最短経路木Ｔ（ｖ）においては、Ｔ（ｖ）に含まれる任意の頂点ｗに対して、頂点ｖから頂点ｗへのＴ（ｖ）における経路が最短経路になるということである。なお、頂点ｖから頂点ｗへのＴ（ｖ）における経路は、木の性質からユニークになることが知られている。
【００１６】
この最短経路木において、頂点ｖからある頂点ｗまでの最短経路を求めるには、頂点ｗからその親を辿って、頂点ｖまで到達する際に、辿った頂点を頂点ｗから頂点ｖまで順にリストとして記録しておき、そのリストを逆向きに見ればよい。最短経路木は、頂点の重複がないため、最短経路を表現する方法として非常に有効である。
【００１７】
重み付きグラフの最短経路を求める方式としては、例えば、ある単一の頂点から全頂点への最短経路を求めるダイクストラ（Dijkstra）法が知られており、その計算量（オーダー）は、最大でＯ（｜Ｅ｜＋｜Ｖ｜ｌｏｇ｜Ｖ｜）である。なお、｜Ａ｜は、集合Ａに含まれる要素数を表す。すなわち、｜Ｅ｜は辺の数、｜Ｖ｜は頂点の数である。ダイクストラ法による単一の頂点毎の最短経路の計算を、全頂点対全頂点の最短経路の計算に適用すると、計算量は最大でＯ（｜Ｖ｜（｜Ｅ｜＋｜Ｖ｜ｌｏｇ｜Ｖ｜））となる。
【００１８】
また、重み付きグラフの最短経路を求める別の方式として、全頂点の各々から、全頂点への最短経路を全て求めるワーシャルフロイド（Warshall-Floyd）法が知られており、その計算量は、最大でＯ（｜Ｖ｜３）である。
【００１９】
また、重み付きグラフの最短経路を求める別の方式として、ある単一の頂点から全頂点への最短経路を求めるベルマンフォード（Bellman-Ford）法が知られている。ベルマンフォード法は、グラフが疎な場合（辺の数が頂点の数に比べて比較的少ない場合）、ダイクストラ法より最短経路を求める計算が遅いと言われるが、重みが負の場合でも経路を求めることができるという利点がある。ベルマンフォード法の計算量は、最大でＯ（｜Ｅ｜｜Ｖ｜）である。ベルマンフォード法による単一の頂点毎の最短経路の計算を、全頂点対全頂点の最短経路の計算に適用すると、計算量は最大でＯ（｜Ｅ｜｜Ｖ｜２）となる。
【００２０】
重みなしグラフの最短経路を求める方式としては、幅優先で隣接頂点リストを辿って最短経路を求める幅優先探索方式が存在する。隣接頂点リストとは、ある頂点に隣接する頂点のリストである。また、頂点ｖに繋がる辺の数を頂点ｖの次数と呼ぶ。すなわち、隣接頂点リストに含まれる頂点数が次数である。幅優先探索の計算量は、最大でＯ（｜Ｅ｜＋｜Ｖ｜）である。幅優先探索方式による単一の頂点に対する最短経路の計算を、全頂点対全頂点の最短経路に適用した場合の最大の計算量は、Ｏ（｜Ｅ｜｜Ｖ｜＋｜Ｖ｜２）となる。なお、最短経路木は、幅優先探索を重みなしグラフに適用することで自然に形成される。
【００２１】
以上述べてきた方式は、重みなしの有向グラフにも無向グラフにも適用可能である。以下の２方式は、重みなし無向グラフの最短経路の計算に適用可能な方式であり、全頂点対全頂点の最短経路問題を行列によらず解く方式、及び行列により解く方式が提案されている。行列によらず解く方式の最大の計算量は以下のとおりである。
【００２２】
ａ）｜Ｅ｜> ｜Ｖ｜(ｌｏｇ｜Ｖ｜)２の場合、
Ｏ（｜Ｅ｜｜Ｖ｜／ｌｏｇ｜Ｖ｜）
ｂ）｜Ｅ｜> ｜Ｖ｜ｌｏｇｌｏｇ｜Ｖ｜の場合、
Ｏ（｜Ｅ｜｜Ｖ｜ｌｏｇｌｏｇ｜Ｖ｜／ｌｏｇ｜Ｖ｜）
ｃ）｜Ｅ｜＜＝｜Ｖ｜ｌｏｇｌｏｇ｜Ｖ｜の場合、
Ｏ（｜Ｖ｜２（ｌｏｇｌｏｇ｜Ｖ｜）２／ｌｏｇ｜Ｖ｜）
【００２３】
また、行列により解く方式では、計算量は最大でＯ（｜Ｖ｜２．３７６）であることが報告されている。
【先行技術文献】
【非特許文献】
【００２４】
【非特許文献１】「全域木−Ｗｉｋｉｐｅｄｉａ」［ｏｎｌｉｎｅ］、２０１４年７月１日検索、インターネット＜ＵＲＬ：http://ja.wikipedia.org/wiki/%E5%85%A8%E5%9F%9F%E6%9C%A8＞
【非特許文献２】「ダイクストラ法−Ｗｉｋｉｐｅｄｉａ」［ｏｎｌｉｎｅ］、２０１４年７月１日検索、インターネット＜ＵＲＬ：http://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9%E6%B3%95＞
【非特許文献３】「幅優先探索−Ｗｉｋｉｐｅｄｉａ」［ｏｎｌｉｎｅ］、２０１４年７月１日検索、インターネット＜ＵＲＬ：http://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2＞
【非特許文献４】T.M.Chan, All-Pairs Shortest Paths for Unweighted Undirected Graphs in o(mn) Time, SODA '06 Proceedings of the seventeenth annual ACM-SIAM symposium on Discrete algorithm, 2006
【非特許文献５】R. Seidel, On the all-pairs-shortest-path problem in unweighted undirected graphs. J. Comput. Sys. Sci.,51:400-403, 1995.
【非特許文献６】Z. Galil and O. Margalit, All pairs shortest distances for graphs with small integer length edges. Inf. Comput., 134:103-139, 1997.
【非特許文献７】Z. Galil and O. Margalit, All pairs shortest paths for graphs with small integer length edges. J. Comput. Sys. Sci., 54:243-254, 1997.
【発明の概要】
【発明が解決しようとする課題】
【００２５】
しかしながら、従来技術においては、頂点間の最短経路を表現する最短経路木として、特定の頂点を根とする最短経路木を生成している。最短経路木の生成では、他の頂点の隣接頂点の情報を集約した上で、最短経路を選択しながら、最短経路木を生成していく。この処理を全ての頂点に対して行った場合には、計算量が増加してしまう。また、他の最短経路を計算する従来技術でも、上述したように、全頂点対全頂点の最短経路を全て計算する場合には、計算量が増加してしまう。
【００２６】
本発明は、一つの側面として、グラフに含まれる各頂点を根とする最短経路木生成のための計算量を削減することを目的とする。
【課題を解決するための手段】
【００２７】
一つの態様では、複数の頂点と頂点間を結ぶ辺とで表された重みなしグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する。この際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する。
【発明の効果】
【００２８】
一つの側面として、グラフに含まれる各頂点を根とする最短経路木生成のための計算量を削減することができる、という効果を有する。
【図面の簡単な説明】
【００２９】
【図１】頂点ｖを根とする最短経路木と、頂点ｖからの距離に応じた同心円を示す図である。
【図２】２つの頂点ｖ、ｗの深さ０の最短経路木を示す図である。
【図３】２つの頂点ｖ、ｗの深さ１の最短経路木及び環を示す図である。
【図４】２つの頂点ｖ、ｗの深さ２の最短経路木及び環を示す図である。
【図５】２つの頂点ｖ、ｗの深さ３の最短経路木及び環を示す図である。
【図６】グラフの一例を示す図である。
【図７】同心円状幅優先探索方式における初期化後の頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図８】同心円状幅優先探索方式において、深さ１まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図９】同心円状幅優先探索方式において、深さ２まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図１０】同心円状幅優先探索方式における最短経路木生成を実行するための生成装置の機能ブロック図である。
【図１１】同心円状幅優先探索方式における最短経路木生成処理のメイン処理の一例を示すフローチャートである。
【図１２】同心円状幅優先探索方式における深さｋの処理の一例を示すフローチャートである。
【図１３】同心円状幅優先探索方式における頂点ｖを根とする深さｋの最短経路木生成処理の一例を示すフローチャートである。
【図１４】頂点の一例を示す図である。
【図１５】深さ３の最短経路木の生成の途中段階を示す図である。
【図１６】隣接最短経路木の活用を説明するための図である。
【図１７】第１及び第２実施形態に係る生成装置の機能ブロック図である。
【図１８】隣接最短経路木の活用を説明するための図である。
【図１９】第１及び第２実施形態に係る生成装置として機能するコンピュータの一例を示す概略ブロック図である。
【図２０】無向グラフの一例を示す図である。
【図２１】第１実施形態における初期化後の頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図２２】第１実施形態における頂点ｖを根とする深さｋの最短経路木生成処理の一例を示すフローチャートである。
【図２３】第１実施形態における頂点ｖを根とする深さ１の最短経路木生成処理の一例を示すフローチャートである。
【図２４】第１実施形態における頂点ｖを根とする深さ２以上の最短経路木生成処理の一例を示すフローチャートである。
【図２５】第１実施形態において、深さ１まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図２６】第１実施形態において、深さ１まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図２７】第１実施形態において、深さ２まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図２８】第１実施形態において、深さ２まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図２９】第１実施形態において、深さ３まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図３０】第１実施形態において、深さ３まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図３１】頂点ｖから到達可能な有向グラフの一例を示す図である。
【図３２】無向グラフと見て非連結な有向グラフの一例を示す図である。
【図３３】全ての頂点から到達不可能な有向グラフの一例を示す図である。
【図３４】第２実施形態における最短経路木生成処理のメイン処理の一例を示すフローチャートである。
【図３５】有向グラフの一例を示す図である。
【図３６】第２実施形態における初期化後の頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図３７】第２実施形態における深さｋの処理の一例を示すフローチャートである。
【図３８】第２実施形態における頂点ｖを根とする深さ１の最短経路木生成処理の一例を示すフローチャートである。
【図３９】第２実施形態において、深さ１まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図４０】第２実施形態において、深さ１まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図４１】第２実施形態における頂点ｖを根とする深さ２以上の最短経路木生成処理の一例を示すフローチャートである。
【図４２】第２実施形態において、深さ２まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図４３】第２実施形態において、深さ２まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図４４】第２実施形態において、深さ３まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【図４５】第２実施形態において、深さ３まで最短経路木が生成された段階での頂点オブジェクト及びｔ−頂点オブジェクトの一例を示す図である。
【発明を実施するための形態】
【００３０】
以下、図面を参照して本発明に係る実施形態の一例を詳細に説明する。以下の各実施形態では、頂点と、頂点間を結ぶ辺とで構成されたグラフに含まれる各頂点について、他の頂点との最短経路を表現する最短経路木を生成する。
【００３１】
特に、実施形態では、最短経路を求める問題として、より具体的に、重みなしグラフにおける各頂点から、距離ｄ以内に存在する全ての頂点の各々までの最短経路を求めることを目的とする。距離ｄ以内としているのは、アプリケーションによっては、各頂点から、グラフに含まれる全ての頂点の各々までの最短経路を必要としない場合も想定されるため、アプリケーションに応じた範囲で最短経路を求める趣旨である。例えば、人間関係のネットワーク的データを表すグラフの例で、直接の関係を有さない人にアクセスするための最短経路を求めるようなアプリケーションの場合、自身から距離３までに存在する人を目的の人として設定できれば十分な場合がある。このような場合にはｄ＝３と設定することで、より距離の遠い頂点までの最短経路の計算を省略することができる。
【００３２】
なお、後述するように、距離ｄとして大きな値を設定することにより、グラフに含まれる全頂点の各々から、他の全頂点の各々への最短経路を求める場合も含まれることになる。また、重みなしグラフの最短経路を求める問題は、辺に付与された重みが全て「１」である重み付きグラフの最短経路問題とも考えられる。すなわち、実施形態で求める最短経路は、重み付きグラフの最短経路問題の特別な場合とも考えられる。
【００３３】
また、以下で説明する各実施形態の基礎となる方式、及び第１実施形態については、無向グラフを前提に説明する。有向グラフ特有の内容については、第２実施形態で詳しく説明する。
【００３４】
＜同心円状幅優先探索方式＞
まず、実施形態の詳細を説明する前に、以下の各実施形態の基礎となる方式として、幅優先探索と、最短経路木による経路管理と、同心円による頂点管理とを組み合わせた方式について説明する。ここでは、この方式を「同心円状幅優先探索方式」と呼ぶ。以下では、説明に用いている図が示すように、連結な無向グラフの場合を説明する。しかし、隣接頂点リストをその頂点から出て行く辺に繋がる頂点のリストにすること、及び第２実施形態で示す改良を施すことで、有向グラフの方式に書き換えることは容易である。  
【００３５】
「幅優先探索」とは、上述したように、重みなしグラフの最短経路を求めるための手法であり、幅優先で隣接頂点リストを辿って最短経路を求める方式である。「最短経路木による経路管理」とは、幅優先探索により自然に生成された最短経路木の情報を、頂点毎に管理することである。「同心円による頂点管理」とは、頂点毎に、その頂点から距離ｋの位置を、距離ｋ毎の同心円として管理し、同心円上に存在する頂点の集合を、距離ｋに対応付けたリスト［ｋ］として管理することである。本実施形態では、重みなしグラフを扱うため、隣接する頂点間の距離は全て「１」とする。従って、リスト［ｋ］は、根となる頂点からｋ番目の同心円の頂点の集合を表す。なお、リスト［０］は、根となる頂点のみからなる。
【００３６】
図１に、頂点ｖを根とする最短経路木と、頂点ｖを中心とし、頂点ｖと他の頂点との距離に応じた同心円を重ねて表した図を示す。図１では、頂点を黒点で、最短経路木の辺を実線で、元のグラフに含まれる辺のうち、最短経路木に含まれない辺を破線で、同心円を一点破線で表している。頂点、最短経路木の辺、元のグラフの辺、及び同心円の表記方法は、特に断らない限り、他の図においても同様である。
【００３７】
同心円状幅優先探索方式による最短経路木の生成の概要は以下のとおりである。
１）各頂点ｖを根とする深さ０の最短経路木Ｔ（ｖ）は、頂点ｖのみからなる
２）各頂点ｖを根とする最短経路木Ｔ（ｖ）を、同心円状（幅優先的）に拡張しながら生成する
３）頂点ｖ毎に、最短経路木Ｔ（ｖ）の葉に相当する頂点に隣接する全ての頂点から、次に最短経路木Ｔ（ｖ）に含める頂点を探索する。
【００３８】
３）の処理を深さｋ＝１，２，・・・，ｄに対して順に繰り返すことで、上記２）の「同心円状に拡張」が実現される。なお、３）の処理の途中でも、全ての頂点を根とする最短経路木の各々が、グラフに含まれる全ての頂点を含んでいることが判明した場合は、それ以上処理を続ける必要はないため、上記処理を終了する。
【００３９】
また、以下では、頂点ｖから距離ｋの位置を、図１に示すような同心円Ｒｋで表し、各同心円状に存在する頂点の集合を「環」という。同心円状幅優先探索方式では、最短経路木の根となる頂点を中心に、同心円状に拡張しながら最短経路木を生成するため、環Ｒ１、Ｒ２、Ｒ３は、この順で設定される。
【００４０】
図２〜図５に、２つの頂点ｖ、ｗの深さ０から深さ３までの最短経路木、及び深さに応じて設定された環を概略的に示す。図２〜図５では、２頂点ｖ、ｗについてのみ示しているが、他の頂点についても同様に最短経路木が生成される。このようにして、深さ０から順に深さ１、深さ２、深さ３、・・・と最短経路木を生成していく。
【００４１】
次に、同心円状幅優先探索方式で管理するデータのデータ構造について説明する。同心円状幅優先探索方式では、頂点を表すデータ構造体である頂点オブジェクト、及び最短経路木を構成する頂点を表すデータ構造体であるｔ−頂点オブジェクトを管理する。なお、以下では、頂点オブジェクトが示す頂点を単に「頂点」といい、ｔ−頂点オブジェクトが示す頂点を「ｔ−頂点」という。
【００４２】
頂点オブジェクトは、以下の属性を有する。
・ｉｄ・・・頂点ｖを識別するための頂点識別子。例えば、１以上｜Ｖ｜以下のユニークな整数
・ａｄｊ＿ｖｅｒｔｉｃｅｓ・・・頂点ｖに隣接する頂点のリスト（隣接頂点リスト）
・ｓｐｔｒｅｅ＿ｄｅｐｔｈ・・・現段階での最短経路木の深さ。最短経路木内で、頂点ｖからの距離が最大の頂点までの距離でもある。
・ｓｐｔｒｅｅ・・・頂点ｖを根とする最短経路木の根。頂点ｖに対応するｔ−頂点オブジェクトが登録される。
・ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅ・・・頂点ｖを根とする最短経路木に含まれる頂点の頂点識別子をキーとするハッシュ表。キーに対応するハッシュ表の値には、キーが示す頂点識別子で識別される頂点に対応するｔ−頂点オブジェクトが登録される。
・ｒｉｎｇ［ｋ］・・・頂点ｖからの距離がｋである頂点の集合（上述した「環」）に含まれる各頂点に対応するｔ−頂点オブジェクトを配列したリスト
【００４３】
なお、ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅは、頂点識別子がｉｄである頂点が最短経路木内に既に存在するか否かを判定するために使われる。また、ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅは、頂点識別子ｉｄに対応する頂点を求め、頂点ｖから頂点識別子ｉｄに対応する頂点までの最短経路を求める場合にも用いられる。この場合、次に述べるｔ−頂点オブジェクトのｐａｒｅｎｔ属性を辿って、頂点識別子ｉｄに対応する頂点から頂点ｖまでの経路を求め、その経路を頂点ｖから逆に辿ることで、頂点ｖから頂点識別子ｉｄに対応する頂点までの最短経路を求めることになる。
【００４４】
ｔ−頂点オブジェクトは、上述したように、最短経路木を構成するｔ−頂点を表すデータ構造体（オブジェクト）である。「ｔ−」はｔｒｅｅの意味である。頂点ｖを根とする最短経路木Ｔ（ｖ）における頂点間の繋がりは、根となる頂点が異なる毎に異なるため、頂点オブジェクトとは別に、ｔ−頂点オブジェクトとして管理するものである。また、最短経路木の頂点として管理すべき属性は、頂点オブジェクトの全ての属性を必要としないため、頂点オブジェクトとは別に、ｔ−頂点オブジェクトとして管理するものである。
【００４５】
ｔ−頂点オブジェクトは、以下の属性を有する。
・ｖｅｒｔｅｘ・・・ｔ−頂点オブジェクトに対応する頂点オブジェクト
・ｃｈｉｌｄｒｅｎ・・・最短経路木における子のｔ−頂点を表すｔ−頂点オブジェクトのリスト。子がない場合は空
・ｐａｒｅｎｔ・・・最短経路木における親のｔ−頂点を表すｔ−頂点オブジェクト
【００４６】
以下、図６に示すグラフを用いて、頂点オブジェクト及びｔ−頂点オブジェクトについてより具体的に説明する。
【００４７】
図７に、図６に示すグラフに基づいて、初期化（詳細は後述）の結果作成されたデータ構造を示す。この状態は、最短経路木が深さ０まで求まった状態である。１００Ａは頂点ｖ１の頂点オブジェクト、１００Ｂは頂点ｖ２の頂点オブジェクト、１００Ｃは頂点ｖ３の頂点オブジェクトである。また、１０１Ａはｔ＿ｖ１１のｔ−頂点オブジェクト、１０１Ｂはｔ＿ｖ２２のｔ−頂点オブジェクト、１０１Ｃはｔ＿ｖ３３のｔ−頂点オブジェクトである。なお、同心円状幅優先探索方式における頂点オブジェクトを区別なく説明する場合には、単に「頂点オブジェクト１００」と表記し、ｔ−頂点オブジェクトを区別なく説明する場合には、単に「ｔ−頂点オブジェクト１０１」と表記する。
【００４８】
ここで、頂点オブジェクト１００及びｔ−頂点オブジェクト１０１に関する図中及び説明内での表記について説明する。図中の空欄は、属性に対応する値が存在しないことを意味し、説明中では「ＮＩＬ」で表す。すなわち、図中の空欄は、ＮＩＬが設定されていることを意味するが、図を簡明にするため空欄としている。また、［ｘ１，ｘ２，ｘ３］は、要素ｘ１、ｘ２、ｘ３がこの順で配列されたリストを表す。［ｘ１］は、単一の要素ｘ１からなるリストを、［］は空のリストを表す。また、｛（ｘ１，ｙ１），（ｘ２，ｙ２），（ｘ３，ｙ３）｝は、３つのペアからなるハッシュ表（連想記憶）を表し、各ペア（ｘｉ，ｙｉ）は、キーｘｉに対応する値がｙｉであることを表す。そして、このハッシュ表を用いれば、ハッシュ表に含まれるペア数によらず、キーｘｉから一定の時間でｙｉにアクセスし、ｙｉを取り出せるものとする。｛（ｘ１，ｙ１）｝は１つのペア（ｘ１，ｙ１）からなるハッシュ表を表す。
【００４９】
ｔ＿ｖｉｊは、頂点ｖｉを根とする最短経路木に含まれるｔ−頂点のうち、頂点ｖｊに対応するｔ−頂点である。例えば、ｔ＿ｖ２２は、頂点ｖ２を根とする最短経路木に含まれるｔ−頂点であり、かつ頂点ｖ２に対応するもの、すなわち、ｖ２自身を表すものである。従って、頂点ｖ２の頂点オブジェクト１００Ｂにおけるｓｐｔｒｅｅが「ｔ＿ｖ２２」となっているのは、頂点ｖ２を根とする最短経路木の根をｔ−頂点オブジェクトで表すとｔ＿ｖ２２、すなわち頂点ｖ２自身であることを表している。なお、ｔ＿ｖ２２のｔ−頂点オブジェクト１０１Ｂのｐａｒｅｎｔが空欄になっているのは、最短経路木の根が頂点ｖ２であり、木の根には親がないためである。
【００５０】
次に、図８に、図６のグラフにおいて、深さ１まで最短経路木が生成された段階での頂点オブジェクト１００及びｔ−頂点オブジェクト１０１を示す。１０１Ｄはｔ＿ｖ１２のｔ−頂点オブジェクト、１０１Ｅはｔ＿ｖ２１のｔ−頂点オブジェクト、１０１Ｆはｔ＿ｖ２３のｔ−頂点オブジェクト、１０１Ｇはｔ＿ｖ３２のｔ−頂点オブジェクトである。図８に示すように、頂点ｖ２を根とする最短経路木について、ｔ−頂点を表すｔ−頂点オブジェクト１０１Ｅ、１０１Ｂ、１０１Ｆの３つが生成されている。すなわち、頂点ｖ２を根とする最短経路木は、深さ１の段階で、図６に示すグラフの全ての頂点を含んでおり、最短経路木の生成が完了している。一方、頂点ｖ１及び頂点ｖ３の各々を根とする最短経路木は、深さ１の段階では、未だ図６に示すグラフの全ての頂点を含んでおらず、最短経路木の生成が完了していない。このように、根となる頂点によって、最短経路木の深さは異なる。
【００５１】
次に、図９に、図６のグラフにおいて、深さ２まで最短経路木が生成された段階での頂点オブジェクト１００及びｔ−頂点オブジェクト１０１を示す。１０１Ｈは頂点ｔ＿ｖ１３のｔ−頂点オブジェクト、１０１Ｉは頂点ｔ＿ｖ３１のｔ−頂点オブジェクトである。図９に示すように、深さ２の段階で、図６に示すグラフに含まれる頂点の全てについて、各頂点を根とする最短経路木の生成が完了している。
【００５２】
同心円状幅優先探索方式による最短経路木の生成は、例えば、図１０に示す生成装置１１０により実行することができる。生成装置１１０は、図１に示すように、初期化部１１２と生成部１１４とを含む。初期化部１１２は、グラフに含まれる各頂点及び各辺の情報に基づいて、各頂点の頂点オブジェクト１００を初期化すると共に、深さ０までの最短経路木を表すｔ−頂点のｔ−頂点オブジェクト１０１を生成する。生成部１１４は、深さ１、深さ２、・・・と順次最短経路木を拡張し、頂点オブジェクト１００及びｔ−頂点オブジェクト１０１を生成又は更新する。
【００５３】
次に、図１１〜図１３を参照して、同心円状幅優先探索方式による最短経路木生成処理の流れを説明する。図１１はメイン処理、図１２は深さｋの処理、図１３は頂点ｖを根とする深さｋの最短経路木生成処理の一例を示すフローチャートである。また、最短経路木生成処理に応じたデータ構造の変化を、図７〜図９に示した深さ毎の頂点オブジェクト１００及びｔ−頂点オブジェクト１０１を参照しながら説明する。なお、以下では、頂点ｖの頂点オブジェクト１００の属性Ｘを「ｖ．Ｘ」と表記し、ｔ＿ｖのｔ−頂点オブジェクト１０１の属性Ｘを「ｔ＿ｖ．Ｘ」と表記する。
【００５４】
図１１に示す同心円状幅優先探索方式による最短経路木生成処理におけるメイン処理のステップＳ１０で、初期化部１１２が、Ｇ＝（Ｖ，Ｅ）で表されるグラフＧのデータを受け付ける。以下では、グラフＧが図６に示すグラフ、すなわち、Ｖ＝［ｖ１，ｖ２，ｖ３］、Ｅ＝［ｖ１＿ｖ２，ｖ２＿ｖ３］の場合について説明する。なお、頂点のデータｖｉのｉは、各頂点を識別するための頂点識別子であり、１〜｜Ｖ｜のユニークな値とする。ここでは、ｉ＝１，２，３である。辺のデータＥは、辺の両端の頂点を連結して表される。以下では、グラフＧに含まれる頂点は、頂点識別子をインデクスとする配列Ｖｅｒｔｅｘ［］で管理される。
【００５５】
初期化部１１２は、受け付けたグラフＧのデータに基づいて、各頂点の頂点オブジェクト１００を初期化する。具体的には、初期化部１１２は、頂点ｖの頂点識別子をｖ．ｉｄに登録する。また、初期化部１１２は、頂点ｖを一端とする辺の他端の頂点を抽出し、頂点ｖの隣接頂点リストとして、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓに登録する。また、初期化部１１２は、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈに、最短経路木の現段階での深さとして「０」を登録する。そして、初期化部１１２は、頂点ｖに対応するｔ−頂点オブジェクト１０１を生成し、ｔ＿ｖ．ｖｅｒｔｅｘにｖを登録し、ｔ＿ｖ．ｃｈｉｌｄｒｅｎに［］を設定し、ｔ＿ｖ．ｐａｒｅｎｔにＮＩＬを設定する。また、初期化部１１２は、ｖ．ｓｐｔｒｅｅに、生成したｔ−頂点オブジェクトｔ＿ｖを登録する。また、初期化部１１２は、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに、キーをｖ．ｉｄ、値をｔ＿ｖとするペア（ｖ．ｉｄ，ｔ＿ｖ）を含むハッシュ表を登録する。また、初期化部１１２は、ｖ.ｒｉｎｇ［０］に、ｔ＿ｖを含むリストを登録する。
【００５６】
この初期化の処理により、図７に示す頂点オブジェクト１００Ａ、１００Ｂ、１００Ｃ、及びｔ−頂点オブジェクト１０１Ａ、１０１Ｂ、１０１Ｃが生成される。
【００５７】
次に、ステップＳ２０で、生成部１１４が、変数ｃ及び変数ｋの各々に０を設定する。変数ｃは、最短経路木に含まれる頂点の数が｜Ｖ｜に等しくなったもの、すなわち、グラフＧに含まれる全ての頂点を含み、これ以上は拡張できない最短経路木の数をカウントするための変数である。変数ｋは、最短経路木の深さを示す変数である。次に、ステップＳ３０で、生成部１１４が、変数ｋを１インクリメントし、次に、ステップＳ４０で、生成部１１４が、変数ｋが、最短経路木を生成する深さとして予め設定された値ｄ以下か否かを判定する。変数ｋがｄ以下の場合には、処理はステップＳ５０へ移行する。
【００５８】
なお、全頂点から全頂点への最短経路を求めたい場合は、ｄ＝｜Ｖ｜−１とすればよい。これは、ある頂点から最も遠いところにある頂点までの距離は高々ｄ＝｜Ｖ｜−１だからである。すなわち、頂点ｖから、残りの｜Ｖ｜−１個の頂点を直線状に並べたグラフにおける、頂点ｖから最も遠い頂点までの距離は｜Ｖ｜−１である。仮に、ｄ＝｜Ｖ｜−１に設定しても、全ての頂点が直線状に接続されたグラフ以外は、後述する変数ｃの働きにより、変数ｋが｜Ｖ｜−１に達する前に最短経路木の生成は終了する。
【００５９】
ステップＳ５０では、生成部１１４が、図１２に示す深さｋの処理を実行する。
【００６０】
図１２のステップＳ５１で、生成部１１４が、ｖ．ｉｄに対応する変数ｉｄに０を設定し、次に、ステップＳ５２で、ｉｄを１インクリメントする。次に、ステップＳ５３で、生成部１１４が、変数ｉｄが、グラフＧに含まれる頂点の数｜Ｖ｜以下か否かを判定することにより、全ての頂点について深さｋの処理が終了したか否かを判定する。変数ｉｄが｜Ｖ｜以下の場合には、処理はステップＳ５４へ移行する。
【００６１】
ステップＳ５４では、生成部１１４が、頂点の配列Ｖｅｒｔｅｘ［］から、頂点識別子がｉｄである頂点Ｖｅｒｔｅｘ［ｉｄ］を抽出し、処理対象の頂点ｖに設定する。
【００６２】
次に、ステップＳ５５で、生成部１１４が、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されている頂点の数が｜Ｖ｜未満か否かを判定することにより、頂点ｖを根とする最短経路木の生成が完了しているか否かを判定する。ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されている頂点の数が｜Ｖ｜未満の場合には、頂点ｖを根とする最短経路木の生成は未完了であると判定して、処理はステップＳ５６へ移行する。ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されている頂点の数が｜Ｖ｜に達している場合には、頂点ｖを根とする最短経路木の生成は完了していると判定して、処理はステップＳ５２に戻る。
【００６３】
ステップＳ５６では、生成部１１４が、図１３に示す頂点ｖを根とする深さｋの最短経路木生成処理を実行する。
【００６４】
図１３のステップＳ５６１で、生成部１１４が、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈにｋを設定すると共に、属性としてｖ．ｒｉｎｇ［ｋ］を追加し、ｖ．ｒｉｎｇ［ｋ］に空のリスト［］を設定する。次に、ステップＳ５６２で、生成部１１４が、ｖ．ｒｉｎｇ［ｋ−１］に、後段の処理が未処理の頂点が存在するか否かを判定する。未処理の頂点が存在する場合には、処理はステップＳ５６３へ移行し、未処理の頂点が存在しない場合には、図１２に示す深さｋの処理に戻る。
【００６５】
ステップＳ５６３では、生成部１１４が、ｖ．ｒｉｎｇ［ｋ−１］に存在する未処理の頂点のうち、ｖ．ｒｉｎｇ［ｋ−１］の先頭に一番近い頂点を抽出し、ｔ＿ｗに設定する。次に、ステップＳ５６４で、生成部１１４が、ｔ＿ｗ．ｖｅｒｔｅｘに登録された頂点オブジェクトを抽出し、頂点ｗに設定する。例えば、ｋ＝１、ｉｄ＝１の場合、ｖ１．ｒｉｎｇ［０］からｔ＿ｖ１１が抽出される。そして、ｔ＿ｖ１１．ｖｅｒｔｅｘに登録された頂点オブジェクトｖ１が抽出され、頂点ｖ１が頂点ｗに設定される。
【００６６】
次に、ステップＳ５６５で、生成部１１４が、ｗ．ａｄｊ＿ｖｅｒｔｉｃｅｓに、後段の処理が未処理の頂点が存在するか否かを判定する。未処理の頂点が存在する場合には、処理はステップＳ５６６へ移行し、未処理の頂点が存在しない場合には、処理はステップＳ５６２に戻る。
【００６７】
ステップＳ５６６では、生成部１１４が、ｗ．ａｄｊ＿ｖｅｒｔｉｃｅｓに存在する未処理の頂点のうち、ｗ．ａｄｊ＿ｖｅｒｔｉｃｅｓの先頭に一番近い頂点を抽出し、ｘに設定する。例えば、上記のｋ＝１、ｉｄ＝１の例の場合、頂点ｗである頂点ｖ１の頂点オブジェクト１０１Ａのｖ１．ａｄｊ＿ｖｅｒｔｉｃｅｓに登録されている頂点ｖ２が頂点ｘとして設定される。
【００６８】
次に、ステップＳ５６７で、生成部１１４が、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に、頂点ｘの頂点識別子、すなわちｘ．ｉｄに登録されている頂点識別子をキーとするペアが登録されているか否かを判定する。登録されていない場合には、処理はステップＳ５６８へ移行し、登録されている場合には、頂点ｘは既に頂点ｖを根とする深さｋの最短経路木に含まれていると判定して、処理はステップＳ５６５に戻る。
【００６９】
ステップＳ５６８では、生成部１１４が、頂点ｘに対応するｔ＿ｘのｔ−頂点オブジェクト１０１を生成する。そして、生成部１１４が、ｔ＿ｘ．ｖｅｒｔｅｘにｘを登録し、ｔ＿ｘ．ｃｈｉｌｄｒｅｎに空のリスト［］を設定し、ｔ＿ｘ．ｐａｒｅｎｔに、ｔ＿ｗを登録する。また、生成部１１４は、ｔ＿ｗ．ｃｈｉｌｄｒｅｎに登録されたリストの末尾に、ｔ＿ｘを追加する。また、生成部１１４は、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に、キーをｘ．ｉｄ、値をｔ＿ｘとするペアを追加し、ｖ.ｒｉｎｇ［ｋ］に登録されたリストの末尾に、ｔ＿ｘを追加する。
【００７０】
例えば、上記のｋ＝１、ｉｄ＝１の例の場合、頂点ｘとして抽出された頂点ｖ２に対応するｔ＿ｖ１２のｔ−頂点オブジェクト１０１Ｄが生成され、ｔ＿ｖ１２．ｖｅｒｔｅｘにｖ２が登録され、ｔ＿ｖ１２．ｐａｒｅｎｔにｔ＿ｖ１１が登録される。また、ｔ＿ｖ１１．ｃｈｉｌｄｒｅｎに登録されたリストの末尾に、ｔ＿ｖ１２が追加される。そして、ｖ１．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に、ペア（２，ｔ＿ｖ１２）が追加され、ｖ１.ｒｉｎｇ［１］に登録されたリストの末尾に、ｔ＿ｖ１２が追加される。これにより、図８に示すように、ｔ−頂点オブジェクト１０１Ｄが生成されると共に、頂点オブジェクト１００Ａが更新され、またｔ−頂点オブジェクト１０１Ａが更新される。
【００７１】
次に、ステップＳ５６９で、生成部１１４が、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に含まれるペア数、すなわち最短経路木Ｔ（ｖ）に含まれる頂点の数が｜Ｖ｜に達したか否かを判定する。これにより、頂点ｖを根とする最短経路木Ｔ（ｖ）の生成が完了したか否かを判定する。ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されている頂点の数が｜Ｖ｜未満の場合には、頂点ｖを根とする最短経路木の生成は未完了であると判定して、処理はステップＳ５６５に戻る。ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されている頂点の数が｜Ｖ｜に達している場合には、頂点ｖを根とする最短経路木の生成が完了したと判定して、処理は図１２に示す深さｋの処理に戻る。
【００７２】
次に、図１２のステップＳ５７で、上記ステップＳ５６で、頂点ｖを根とする最短経路木が完成したか否か、すなわち、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されている頂点が｜Ｖ｜に等しいか否かを判定する。図１３に示すステップＳ５６９で肯定判定されて本ステップへ移行した場合には、生成部１１４は、頂点ｖを根とする最短経路木が完成したと判定して、処理はステップＳ５８へ移行する。図１３に示すステップＳ５６２で否定判定されて本ステップへ移行した場合には、生成部１１４は、頂点ｖを根とする最短経路木が未完成であると判定して、処理はステップＳ５２に戻る。
【００７３】
ステップＳ５８では、生成部１１４が、変数ｃを１インクリメントし、次のステップＳ５９で、変数ｃが｜Ｖ｜に達したか否かを判定する。最短経路木生成処理のループの途中でも、グラフに含まれる全ての頂点を根とする最短経路木の生成が、全て完了する場合がある。そこで、本ステップが肯定判定となる場合には、それ以上処理を続ける必要がないため、メイン処理に戻って、最短経路木生成処理全体を終了する。否定判定の場合には、処理はステップＳ５２に戻る。
【００７４】
ステップＳ５２〜Ｓ５９の処理を繰り返し、ステップＳ５３で否定判定されると、深さｋの処理を終了して、図１１に示すメイン処理に戻り、ステップＳ３０に戻る。ステップＳ３０〜Ｓ５０の処理を繰り返し、ステップＳ４０で、変数ｋがｄを超えたと判定されると、目的の深さまでの最短経路木の生成が終了したと判定し、メイン処理を終了する。
【００７５】
図８は、ｋ＝１についての深さｋの処理が終了した段階での頂点オブジェクト１００及びｔ−頂点オブジェクト１０１である。また、図９は、ｋ＝２についての深さｋの処理が終了した段階での頂点オブジェクト１００及びｔ−頂点オブジェクト１０１である。
【００７６】
図１４及び図１５に示すより複雑なグラフを用いて、頂点とｔ−頂点との関係を示す。図１４は、頂点オブジェクトが示す頂点によって表されたグラフ、図１５は、ｔ−頂点オブジェクトが示すｔ-頂点によって表された、頂点ｖを根とする最短経路木を示すグラフである。頂点ｖ，ｗ，ｘ１，ｘ２，ｘ３の各々と、ｔ−頂点ｔ＿ｖ，ｔ＿ｗ，ｔ＿ｘ１，ｔ＿ｘ２，ｔ＿ｘ３の各々とが対応する。図１５は、深さｋ＝３の最短経路木Ｔ（ｖ）の生成の途中段階を示している。具体的には、頂点ｖを根とする深さ３の最短経路木の生成処理（図１３参照）のステップＳ５６３で、最初にｔ＿ｗが抽出され、ステップＳ５６６からＳ５６８で、頂点ｗに隣接する頂点ｘ１，ｘ２，ｘ３をこの順に調べて、それぞれに対応するｔ＿ｘ１，ｔ＿ｘ２，ｔ＿ｘ３を示すｔ−頂点オブジェクトが順に生成されたところを表している。この時点で、ｖ．ｒｉｎｇ［３］に登録されたリストに含まれるｔ−頂点はｔ＿ｘ１，ｔ＿ｘ２，ｔ＿ｘ３である。
【００７７】
＜実施形態の概要＞
上記の同心円状幅優先探索方式では、最短経路木を拡張する際、生成済みの最短経路木における葉に相当する頂点に隣接する全ての頂点を探索して、頂点ｖを根とする最短経路木に含めるか否かを調べている。したがって、同心円状幅優先探索方式では、ａを各頂点に繋がる辺の数の平均とすると、頂点毎にａ回調べる必要がある。
【００７８】
一方、以下の各実施形態では、同心円状幅優先探索方式を基礎とし、既に生成されている最短経路木を活用して、隣接する全頂点を探索する代わりに、活用する最短経路木の子だけを探索することで、隣接頂点へのアクセス回数を削減する。
【００７９】
詳細は後述するが、実施形態では、頂点ｖを根とする最短経路木Ｔ（ｖ）を生成する際、頂点ｖに隣接する頂点を根とする最短経路木を活用する。仮に、頂点ｖに隣接する頂点の数が１つ、すなわち活用する最短経路木が１つであれば、本実施形態により頂点毎の隣接頂点へのアクセス回数は、ａ回からおおよそ１回に削減できることが期待できる。というのは、一般に頂点の数がｎの木は、ｎ−１個の辺を持ち、従って、１つの頂点当たりの探索すべき辺の数は、平均的には（ｎ−１）／ｎで、おおよそ１となるからである。ただし、一般には隣接頂点は複数であり、従って活用する最短経路木も複数となるため、ａ回から１回に削減することはできないが、大幅な削減が期待できる。なお、説明は省略するが、よく知られているように、無向グラフではａ＝２｜Ｅ｜／｜Ｖ｜（第２実施形態で説明する有向グラフの場合は、各頂点から出る辺の数の平均をａとすると、ａ＝｜Ｅ｜／｜Ｖ｜）である。
【００８０】
上述したように、頂点ｖを根とする最短経路木Ｔ（ｖ）を生成する場合、活用する最短経路木は、頂点ｖに隣接する頂点をｗ１，ｗ２，・・・，ｗｍとすると、Ｔ（ｗ１），Ｔ（ｗ２），・・・，Ｔ（ｗｍ）である。以下では、これらの最短経路木を、「頂点ｖの隣接最短経路木」と呼ぶ。
【００８１】
頂点ｖに隣接する頂点の任意の一つを頂点ｗとすると、同心円状幅優先探索方式に従って最短経路木を生成していくと、Ｔ（ｗ）には、Ｔ（ｖ）よりも距離が１先の頂点にアクセスしている部分がある。本実施形態では、この部分を活用する。
【００８２】
図１６に、頂点ｖ１を根とする最短経路木Ｔ（ｖ１）と、頂点ｖ１を中心とする同心円状の環を示す。ここで、頂点ｖ１から距離１にある頂点ｖを根とする最短経路木Ｔ（ｖ）を生成する場合に、Ｔ（ｖ１）がどのように活用されるかを説明する。なお、頂点ｖに隣接する頂点には他にｖ２、ｖ３、ｗ９があるので、Ｔ（ｖ）は、Ｔ（ｖ２）、Ｔ（ｖ３）、及びＴ（ｗ９）も活用して生成されるが、ここでは、Ｔ（ｖ１）をどのように活用するかという点に着目して説明する。
【００８３】
Ｔ（ｖ）が深さ３まで生成されており、頂点ｖからの距離が３の環に含まれる頂点ｗからさらに最短経路木を拡張していく場合を考える。同心円状幅優先探索方式では、頂点ｗに隣接する頂点ｗ１，ｗ２，・・・，ｗ７の全てを探索しなければならない。しかし、Ｔ（ｖ１）では、頂点ｗの子は頂点ｗ２のみであるので、頂点ｗからＴ（ｖ）を拡張する際は、頂点ｗ２のみを探索すればよい。すなわち、この例では隣接頂点へのアクセス回数が７回から１回に削減されることになる。
【００８４】
なお、上述のように頂点ｖから距離３の位置の頂点ｗからＴ（ｖ）を拡張する際には、頂点ｖの隣接最短経路木を活用することによる隣接頂点へのアクセス回数の削減効果があるが、頂点ｖから距離１の位置では本実施形態の削減効果はない。頂点ｖからの距離１の位置の頂点ｖ１からＴ（ｖ）を拡張する際にＴ（ｖ１）を利用しても、頂点ｖ１の子は、頂点ｖ１に隣接する全ての頂点ｖ、ｗ７、ｗ８、ｗ９だからである。本実施形態によるアクセス回数の削減効果が現れるのは、頂点ｖからの距離が２以上の頂点からＴ（ｖ）を拡張する場合、すなわちｋが３以上の場合である。
【００８５】
以下、各実施形態について詳細に説明する。なお、各実施形態は、上述した同心円状幅優先探索方式を基礎とするため、主に、同心円状幅優先探索方式と異なる点について説明し、同心円状幅優先探索方式と同様の部分については、詳細な説明を省略する。また、第１実施形態の説明は、同心円状幅優先探索方式の説明と同様、連結な無向グラフを前提とする。ただし、第２実施形態で示す改良を施すことで、非連結グラフに適用できるようにすることは容易である。
【００８６】
＜第１実施形態＞
図１７に示すように、第１実施形態に係る生成装置１０は、初期化部１２と生成部１４とを含む。初期化部１２は、グラフに含まれる各頂点及び各辺の情報に基づいて、各頂点の頂点オブジェクトを初期化すると共に、深さ０までの最短経路木を表すｔ−頂点オブジェクトを生成する。生成部１４は、深さ１、深さ２、・・・と順次最短経路木を拡張し、頂点オブジェクト及びｔ−頂点オブジェクトを生成又は更新する。初期化部１２及び生成部１４が最短経路木を生成する際、同心円状幅優先探索方式の場合と異なり、上述したように、既に作成されている隣接最短経路木を活用する。
【００８７】
ここで、初期化部１２及び生成部１４により生成又は更新されるｔ−頂点オブジェクトについて、同心円状幅優先探索方式におけるｔ−頂点オブジェクト１０１と異なる点を説明する。なお、頂点オブジェクトについては、同心円状幅優先探索方式における頂点オブジェクト１００と同様である。本実施形態におけるｔ−頂点オブジェクトには、属性ｏｒｉｇｉｎａｌが加えられる。ｏｒｉｇｉｎａｌには、ｔ−頂点オブジェクトに対応する、活用する隣接最短経路木におけるｔ−頂点オブジェクトが登録される。以下、より詳細に説明する。
【００８８】
図１８に、頂点ｖを根とする最短経路木Ｔ（ｖ）、及び頂点ｖに隣接する頂点ｗを根とする最短経路木Ｔ（ｗ）を示す。図１８において、Ｔ（ｖ）の辺は実線で、Ｔ（ｗ）の辺は破線で示している。Ｔ（ｖ）を生成する際にＴ（ｗ）を活用するとする。例えば、頂点ｘからさらにＴ（ｗ）の辺を辿って、頂点ｙにアクセスし、頂点ｙに対応するｔ−頂点オブジェクトｔ＿ｙを生成し、Ｔ（ｖ）に加えることを考える。このとき、Ｔ（ｗ）の頂点ｙに対応するｔ−頂点オブジェクトｔ＿ｙ’にアクセスしているはずである。このｔ＿ｙ’をｔ＿ｙのｏｒｉｇｉｎａｌとする。
【００８９】
生成装置１０は、例えば図１９に示すコンピュータ４０で実現することができる。コンピュータ４０はＣＰＵ４１、一時記憶領域としてのメモリ４２、及び不揮発性の記憶部４３を備える。また、コンピュータ４０は、入出力装置４８が接続される入出力インターフェース（Ｉ／Ｆ）４４を備える。また、コンピュータ４０は、記録媒体４９に対するデータの読み込み及び書き込みを制御するｒｅａｄ／ｗｒｉｔｅ（Ｒ／Ｗ）部４５、及びインターネット等のネットワークに接続されるネットワークＩ／Ｆ４６を備える。ＣＰＵ４１、メモリ４２、記憶部４３、入出力Ｉ／Ｆ４４、Ｒ／Ｗ部４５、及びネットワークＩ／Ｆ４６は、バス４７を介して互いに接続される。
【００９０】
記憶部４３はＨＤＤ（Hard Disk Drive）、ＳＳＤ（solid state drive）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部４３には、コンピュータ４０を生成装置１０として機能させるための生成プログラム５０が記憶される。ＣＰＵ４１は、生成プログラム５０を記憶部４３から読み出してメモリ４２に展開し、生成プログラム５０が有するプロセスを順次実行する。
【００９１】
生成プログラム５０は、初期化プロセス５２と、生成プロセス５４とを有する。ＣＰＵ４１は、初期化プロセス５２を実行することで、図１７に示す初期化部１２として動作する。また、ＣＰＵ４１は、生成プロセス５４を実行することで、図１７に示す生成部１４として動作する。これにより、生成プログラム５０を実行したコンピュータ４０が、生成装置１０として機能することになる。
【００９２】
なお、生成プログラム５０により実現される機能は、例えば半導体集積回路、より詳しくはＡＳＩＣ（Application Specific Integrated Circuit）等で実現することも可能である。
【００９３】
次に、第１実施形態に係る生成装置１０の作用について説明する。なお、生成装置１０で実行される最短経路木生成処理について、上述した同心円状幅優先探索方式における最短経路木の生成処理と同様な処理については、詳細な説明を省略する。あわせて、図２１及び図２５〜図３０を参照して、第１実施形態における最短経路木生成処理に応じたデータ構造の変化を説明する。
【００９４】
まず、同心円状幅優先探索方式と同様に、図１１に示すメイン処理から、最短経路木の生成処理を開始する。
【００９５】
図１１のステップＳ１０で、初期化部１２が、Ｇ＝（Ｖ，Ｅ）で表されるグラフＧのデータを受け付ける。以下では、グラフＧが図２０に示すグラフ、すなわち、Ｖ＝［ｖ１，ｖ２，ｖ３，ｖ４］、Ｅ＝［ｖ１＿ｖ２，ｖ２＿ｖ３，ｖ３＿ｖ４］の場合について説明する。初期化部１２は、同心円状幅優先探索方式における初期化処理に加え、ｔ＿ｖ．ｏｒｉｇｉｎａｌにＮＩＬを設定する。図２１に、初期化終了時点、すなわち深さ０の最短経路木まで生成された段階の頂点オブジェクト及びｔ−頂点オブジェクトを示す。
【００９６】
６０Ａは頂点ｖ１の頂点オブジェクト、６０Ｂは頂点ｖ２の頂点オブジェクト、６０Ｃは頂点ｖ３の頂点オブジェクト、６０Ｄは頂点ｖ４の頂点オブジェクトである。また、６１Ａはｔ＿ｖ１１のｔ−頂点オブジェクト、６１Ｂはｔ＿ｖ２２のｔ−頂点オブジェクト、６１Ｃはｔ＿ｖ３３のｔ−頂点オブジェクト、６１Ｄはｔ＿ｖ４４のｔ−頂点オブジェクトである。なお、第１実施形態における頂点オブジェクトを区別なく説明する場合には、単に「頂点オブジェクト６０」と表記し、ｔ−頂点オブジェクトを区別なく説明する場合には、単に「ｔ−頂点オブジェクト６１」と表記する。
【００９７】
図２１に示すように、ｔ−頂点オブジェクト６１に属性「ｏｒｉｇｉｎａｌ」が追加されている点が、図７に示す同心円状幅優先探索方式の場合と異なる。
【００９８】
同心円状幅優先探索方式とは、図１１及び図１２の処理は同じである。ただし、図１２の頂点ｖを根とする深さｋの最短経路木生成処理の内容が異なるため、以下図２２〜図２４を参照して、第１実施形態における頂点ｖを根とする深さｋの最短経路木生成処理について説明する。なお、同心円状幅優先探索方式における頂点ｖを根とする深さｋの最短経路木生成処理と同一の処理については、同一符号を付して詳細な説明を省略する。
【００９９】
図２２のステップＳ６００で、生成部１４が、深さを示す変数ｋが１か否かを判定する。ｋが１の場合には、処理はステップＳ６１０へ移行し、図２３に示す頂点ｖを根とする深さ１の最短経路木生成処理を実行した後、図１２に示す深さｋの処理に戻る。一方、ｋが１ではない場合、すなわち、ｋが２以上の場合には、処理はステップＳ６２０へ移行し、図２４に示す頂点ｖを根とする深さ２以上の最短経路木生成処理を実行した後、図１２に示す深さｋの処理に戻る。
【０１００】
次に、図２３のステップＳ６１１で、生成部１４が、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈに１を設定すると共に、属性としてｖ．ｒｉｎｇ［１］を追加し、ｖ．ｒｉｎｇ［１］に空のリスト［］を設定する。また、生成部１４が、ｖ．ｒｉｎｇ［０］に登録されているｔ−頂点をｔ＿ｖに設定する。
【０１０１】
なお、同心円状幅探索方式における頂点ｖを根とする深さｋの最短経路木生成処理では、上記ステップＳ６１１に相当するステップＳ５６１の後に、ｖ．ｒｉｎｇ［ｋ−１］からｔ＿ｗを抽出し、ｔ＿ｗ．ｖｅｒｔｅｘから頂点ｗを取得する必要がある。しかし、ｋ＝１の場合、ｔ＿ｗ＝ｔ＿ｖであり、ｔ＿ｖに対応する頂点ｖもステップＳ５４の処理で判明しているため、頂点ｗを取得する処理は不要である。
【０１０２】
次に、ステップＳ６１２で、生成部１４が、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓに、後段の処理が未処理の頂点が存在するか否かを判定する。未処理の頂点が存在する場合には、処理はステップＳ６１３へ移行し、未処理の頂点が存在しない場合には、頂点ｖを根とする深さ１の最短経路木生成処理を終了し、図２２に戻る。
【０１０３】
ステップＳ６１３では、生成部１４が、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓに存在する未処理の頂点のうち、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓの先頭に一番近い頂点を抽出し、ｘに設定する。例えば、ｉｄ＝１の場合、頂点ｖ１の頂点オブジェクト６０Ａのｖ１．ａｄｊ＿ｖｅｒｔｉｃｅｓに登録されている頂点オブジェクトｖ２が抽出され、頂点ｖ２が頂点ｘに設定される。
【０１０４】
次に、ステップＳ６１４で、生成部１４が、頂点ｘに対応するｔ＿ｘのｔ−頂点オブジェクト６１を生成する。そして、生成部１４が、ｔ＿ｘ．ｖｅｒｔｅｘに「ｘ」を登録し、ｔ＿ｘ．ｃｈｉｌｄｒｅｎに空のリスト［］を設定し、ｔ＿ｘ．ｐａｒｅｎｔに、ｔ＿ｖを登録し、ｔ＿ｘ．ｏｒｉｇｉｎａｌにｘ．ｓｐｔｒｅｅに登録されたｔ−頂点オブジェクトを登録する。また、生成部１４は、ｔ＿ｖ．ｃｈｉｌｄｒｅｎに登録されたリストの末尾に、ｔ＿ｘを追加する。また、生成部１４は、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に、キーをｘ．ｉｄ、値をｔ＿ｘとするペアを追加する。また、生成部１４は、ｖ.ｒｉｎｇ［１］に登録されたリストの末尾に、ｔ＿ｘを追加する。
【０１０５】
例えば、上記のｉｄ＝１の例の場合、頂点ｘとして抽出された頂点ｖ２に対応するｔ＿ｖ１２のｔ−頂点オブジェクト６１Ｅ（図２５参照）が生成される。そして、ｔ＿ｖ１２．ｖｅｒｔｅｘにｖ２が登録され、ｔ＿ｖ１２．ｐａｒｅｎｔにｔ＿ｖ１１が登録され、ｔ＿ｖ１２．ｏｒｉｇｉｎａｌにｖ２．ｓｐｔｒｅｅに登録されたｔ＿ｖ２２が登録される。また、ｔ＿ｖ１１．ｃｈｉｌｄｒｅｎに登録されたリストの末尾に、ｔ＿ｖ１２が追加される。また、ｖ１．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に、ペア（２，ｔ＿ｖ１２）が追加され、ｖ１.ｒｉｎｇ［１］に登録されたリストの末尾に、ｔ＿ｖ１２が追加される。
【０１０６】
これにより、図２５に示すように、ｔ−頂点オブジェクト６１Ｅが生成され、頂点オブジェクト６０Ａおよびｔ−頂点オブジェクト６１Ａが更新される。なお、図２５及び図２６は、ｋ＝１についての深さｋの処理が終了した段階での頂点オブジェクト６０及びｔ−頂点オブジェクト６１である。ｋ＝１についての深さｋの処理で、ｔ＿ｖ１２のｔ−頂点オブジェクト６１Ｅ、ｔ＿ｖ２１のｔ−頂点オブジェクト６１Ｆ、ｔ＿ｖ２３のｔ−頂点オブジェクト６１Ｇが生成される。さらに、ｔ＿ｖ３２のｔ−頂点オブジェクト６１Ｈ、ｔ＿ｖ３４のｔ−頂点オブジェクト６１Ｉ、ｔ＿ｖ４３のｔ−頂点オブジェクト６１Ｊも生成される。
【０１０７】
なお、ｋ＝１の場合、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅには、ｔ＿ｖしか登録されておらず、ｔ＿ｖに隣接する頂点は全て未登録であるので、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅにｘ．ｉｄが存在するか否かの判定は不要である。
【０１０８】
次に、図２４に示す頂点ｖを根とする深さ２以上の最短経路木生成処理のステップＳ５６１及びＳ５６２を経て、処理はステップＳ５６３へ移行する。ステップＳ５６３では、生成部１４が、ｖ．ｒｉｎｇ［ｋ−１］に存在する未処理の頂点のうち、ｖ．ｒｉｎｇ［ｋ−１］に登録されたリストの先頭に一番近い頂点を抽出し、ｔ＿ｗに設定する。
【０１０９】
次に、ステップＳ６２１で、生成部１４が、ｔ＿ｗのｔ−頂点オブジェクト６１のｔ＿ｗ．ｏｒｉｇｉｎａｌに登録されたｔ−頂点オブジェクトをｔ＿ｗ＿ｏｒｉｇｉｎａｌに設定する。
【０１１０】
次に、ステップＳ６２２で、生成部１４が、ｔ＿ｗ＿ｏｒｉｇｉｎａｌ．ｃｈｉｌｄｒｅｎに、後段の処理が未処理のｔ−頂点が存在するか否かを判定する。未処理のｔ−頂点が存在する場合には、処理はステップＳ６２３へ移行し、未処理のｔ−頂点が存在しない場合には、処理はステップＳ５６２に戻る。
【０１１１】
ステップＳ６２３では、生成部１４が、ｔ＿ｗ＿ｏｒｉｇｉｎａｌ．ｃｈｉｌｄｒｅｎに存在する未処理のｔ−頂点のうち、ｔ＿ｗ＿ｏｒｉｇｉｎａｌ．ｃｈｉｌｄｒｅｎの先頭に一番近いｔ−頂点を抽出し、ｔ＿ｘ＿ｏｒｉｇｉｎａｌに設定する。同心円状幅優先探索方式では、頂点ｖを根とする最短経路木を拡張する際、生成済みの最短経路木の葉に相当する頂点に隣接する頂点を全て探索する。一方、本実施形態では、本ステップにおいて、頂点ｖに隣接する頂点を根とする最短経路木の子のみを探索する。
【０１１２】
例えば、ｋ＝２、ｉｄ＝１の場合、ｖ１．ｒｉｎｇ［１］からｔ＿ｗとしてｔ＿ｖ１２が抽出される。そして、ｔ＿ｖ１２．ｏｒｉｇｉｎａｌからｔ＿ｗ＿ｏｒｉｇｉｎａｌとしてｔ＿ｖ２２が抽出される。さらに、ｔ＿ｖ２２．ｃｈｉｌｄｒｅｎの先頭からｔ＿ｖ２１が抽出される。
【０１１３】
次に、ステップＳ６２４で、生成部１４が、ｔ＿ｘ＿ｏｒｉｇｉｎａｌ．ｖｅｒｔｅｘに登録されている頂点オブジェクトを頂点ｘに設定する。
【０１１４】
次に、ステップＳ５６７で、生成部１４が、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表にｘ．ｉｄに登録されている頂点識別子をキーとするペアが登録されているか否かを判定する。登録されていない場合には、処理はステップＳ６２５へ移行し、登録されている場合には、処理はステップＳ６２２に戻る。
【０１１５】
ステップＳ６２５では、生成部１４が、頂点ｘに対応するｔ＿ｘのｔ−頂点オブジェクト６１を生成する。そして、生成部１４が、ｔ＿ｘ．ｖｅｒｔｅｘにｘを登録し、ｔ＿ｘ．ｃｈｉｌｄｒｅｎに空のリスト［］を設定し、ｔ＿ｘ．ｐａｒｅｎｔに、ｔ＿ｗを登録し、ｔ＿ｘ．ｏｒｉｇｉｎａｌにｔ＿ｘ＿ｏｒｉｇｉｎａｌを登録する。また、生成部１４は、ｔ＿ｗ．ｃｈｉｌｄｒｅｎに登録されたリストの末尾に、ｔ＿ｘを追加する。また、生成部１４は、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表に、キーをｘ．ｉｄ、値をｔ＿ｘとするペアを追加する。また、生成部１４は、ｖ.ｒｉｎｇ［ｋ］に登録されたリストの末尾に、ｔ＿ｘを追加する。
【０１１６】
例えば、上記のｋ＝２、ｉｄ＝１の例で、ｔ＿ｖ２２．ｃｈｉｌｄｒｅｎの２番目のｔ＿ｖ２３がｔ＿ｗ＿ｏｒｉｇｉｎａｌとして抽出されたとする。この場合、ｔ＿ｖ２３．ｖｅｒｔｅｘに登録されている頂点ｖ３が頂点ｘに設定される。ｖ１．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表には、「３」をキーとするペアは登録されていないので、頂点ｖ３に対応するｔ＿ｖ１３のｔ−頂点オブジェクト６１Ｋ（図２７参照）が生成される。
【０１１７】
具体的には、ｔ＿ｖ１３．ｖｅｒｔｅｘにｘであるｖ３が登録され、ｔ＿ｖ１３．ｃｈｉｌｄｒｅｎに空のリスト［］が設定され、ｔ＿ｖ１３．ｐａｒｅｎｔにｔ＿ｗであるｔ＿ｖ１２が登録され、ｔ＿ｖ１３．ｏｒｉｇｉｎａｌにｔ＿ｖ２３が登録される。また、ｔ＿ｖ１２．ｃｈｉｌｄｒｅｎに登録されたリストの末尾に、ｔ＿ｖ１３が追加される。そして、ｖ１．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録されたハッシュ表にペア（３，ｔ＿ｖ１３）が追加され、ｖ１．ｒｉｎｇ［２］に登録されたリストの末尾に、ｔ＿ｖ１３が追加される。
【０１１８】
図２７及び図２８は、ｋ＝２についての深さｋの処理が終了した段階での頂点オブジェクト６０及びｔ−頂点オブジェクト６１である。ｋ＝２についての深さｋの処理により、ｔ＿ｖ１３のｔ−頂点オブジェクト６１Ｋ、ｔ＿ｖ２４のｔ−頂点オブジェクト６１Ｌ、ｔ＿ｖ３１のｔ−頂点オブジェクト６１Ｍ、ｔ＿ｖ４２のｔ−頂点オブジェクト６１Ｎが生成される。また、図２９及び図３０は、ｋ＝３についての深さｋの処理が終了した段階での頂点オブジェクト６０及びｔ−頂点オブジェクト６１である。ｋ＝３についての深さｋの処理により、ｔ＿ｖ１４のｔ−頂点オブジェクト６１Ｏ、ｔ＿ｖ４１のｔ−頂点オブジェクト６１Ｐが生成される。
【０１１９】
第１実施形態による隣接頂点へのアクセス回数の削減効果は、ｋ＝３以上の最短経路木を生成する際に表れる。図２０のグラフについて、頂点ｖ１を根とする深さ３の最短経路木を生成する場合を例に説明する。すなわち、ｋ＝３、ｉｄ＝１の場合である。この場合、ｖ１.ｒｉｎｇ［２］にｔ＿ｖ１３が登録されているので、ｔ＿ｖ１３をさらに先に延ばしていくことになる。その際、同心円状幅優先探索方式では、ｔ＿ｖ１３に対応する頂点ｖ３の隣接頂点、すなわち、ｖ３．ａｄｊ＿ｖｅｒｔｉｃｅｓに登録されている頂点ｖ２、ｖ４を探索する。すなわち、２つの頂点にアクセスすることになる。
【０１２０】
一方、第１実施形態では、ｔ＿ｖ１３から先に延ばして次のｔ−頂点を探索する際、既に生成されている最短経路木を活用する。ここで、ｔ＿ｖ１３．ｏｒｉｇｉｎａｌに登録されているｔ＿ｖ２３は、ｔ＿ｖ１３がｖ１.ｒｉｎｇ［２］に追加されたｋ＝２の段階で、既に生成済みの最短経路木に含まれるｔ−頂点であり、かつｔ＿ｖ１３と同一の頂点ｖ３に対応するｔ−頂点である。従って、ｔ＿ｖ１３の次のｔ−頂点を、ｔ＿ｖ２３から先に延びた次のｔ−頂点に絞り込むことができる。そこで、ｔ＿ｖ２３の子のみ、すなわち、ｔ＿ｖ２３．ｃｈｉｌｄｒｅｎに登録されているｔ＿ｖ２４のみを探索する。これにより、この例では、同心円状幅優先探索では２回必要な隣接頂点へのアクセス回数を１回に削減することができる。
【０１２１】
以上説明したように、第１実施形態に係る生成装置によれば、グラフに含まれる各頂点を根とする最短経路木を深さ方向に拡張しながら生成する際に、隣接する全ての頂点を探索するのではなく、既に生成済みの最短経路木の子のみを探索する。これにより、隣接する全ての頂点を探索する場合に生じる処理の重複や、冗長な経路についての探索を排除し、最短経路木生成のための計算量を削減することができる。
【０１２２】
＜第２実施形態＞
次に、第２実施形態について説明する。なお、第２実施形態において、第１実施形態と同様の部分については、詳細な説明を省略する。
【０１２３】
第１実施形態では、重みなし無向グラフを対象とする場合について説明したが、第２実施形態では、重みなし有向グラフ、すなわち頂点間の辺に向きがあるグラフを対象とする場合について説明する。有向グラフにおいても、２頂点間の最短経路を求めることは、グラフに対するデータ分析として重要である。
【０１２４】
例えば、Ｔｗｉｔｔｅｒ（登録商標）のように、一方のユーザが他方のユーザをフォローする形式でユーザ間のつながりが形成されるＳＮＳにおける人間関係のネットワーク的データは、有向グラフにより表現することができる。このような有向グラフにおいて、各ユーザに対応する頂点毎に、距離ｄ以内の最短経路を求めることで、ユーザ毎にフォロー関係による結びつきの強い人を同定することができる。
【０１２５】
また、例えば、ルービックキューブ（登録商標）は通常右向きにも、左向きにも回転できるが、ここでは右向きにしか回転してはいけないという規則を付け加えることにする。この場合、ルービックキューブ（登録商標）の各局面を頂点とし、ある局面から右回転で別の局面に遷移する状態を、ある局面に対応する頂点から、別の局面に対応する頂点へ向かう辺で結んだ有向グラフで、局面間の遷移の状態を表現することができる。この有向グラフにおいて、ある局面に対応する頂点から、最終局面（全ての面が１色のみの状態）に対応する頂点までの最短経路は、最適（最小手数の）解を示すことになる。
【０１２６】
また、有向グラフでは、頂点間を結ぶ辺に向きがあることから、無向グラフの場合と「隣接」の定義が異なる。有向グラフでは、図３１に示すように、１つの辺ｅで頂点ｖから 頂点ｗ１へ結ばれている場合、頂点ｗ１は頂点ｖから隣接している（adjacent）、又は、頂点ｖは頂点ｗ１へ隣接しているという。また、この辺ｅは、頂点ｖから出る、頂点ｗ１に入るという。
【０１２７】
上記の隣接の定義に従い、有向グラフでは、頂点の列ｖ０，ｖ１，・・・，ｖｎにおいて、任意のｉ（１≦ｉ≦ｎ）に対して、頂点ｖｉが頂点ｖｉ−１から隣接している場合、この頂点の列を経路（パス）と呼ぶ。また、有向グラフにおける頂点ｖの隣接頂点リストは、頂点ｖから隣接する頂点からなるリストをいう。また、頂点ｖから出る辺の数を頂点ｖの出次数と呼ぶ。すなわち、頂点ｖの出次数は、頂点ｖの隣接頂点リストに含まれる頂点の個数である。同様に、頂点ｖに入る辺の数を頂点ｖの入次数と呼ぶ。
【０１２８】
また、第２実施形態では、有向グラフを無向グラフと見た場合、すなわち、辺の向きに関係なく見た場合に、部分グラフ内の任意の２頂点について、一方から他方への経路がある場合、その部分グラフは連結であるという。例えば、図３１に示す有向グラフの場合、「無向グラフと見て連結」、又は単に「連結」であるという。一方、図３２に示すように、無向グラフとして見た場合にグラフが連結でない場合、「無向グラフと見て非連結」、又は単に「非連結」であるという。
【０１２９】
また、第２実施形態では、部分グラフ内のある頂点ｖから、その部分グラフ内の任意の頂点への経路が存在する場合、部分グラフは「頂点ｖから到達可能である」という。図３１に示す有向グラフは、頂点ｖから他の全ての頂点へ到達可能な有向グラフの例である。なお、頂点ｗ１から頂点ｖへは隣接していないため、頂点ｗ１からは到達可能ではない。他の頂点ｗ２、ｗ３、ｗ４についても同様である。また、図３３は、どの頂点からも到達可能ではない有向グラフの例である。
【０１３０】
また、第２実施形態では、ある頂点ｖから到達可能で、そのグラフを無向グラフとして見た場合に閉路を含まない部分グラフを「木」と呼ぶ。また、第２実施形態では、「最短経路木」は、ある頂点ｖから到達可能な頂点ｖ以外の全ての頂点への最短経路を表現する木である。なお、無向グラフを前提とした場合における最短経路木については、頂点ｖから全ての頂点への最短経路を表現する木と定義した。しかし、ここで説明する有向グラフを対象とする第２実施形態は、連結でないグラフにも適用可能である。そこで、上記のように「最短経路木はある頂点ｖから“到達可能な”頂点ｖ以外の全ての頂点への最短経路を表現する木」と定義している。すなわち、無向グラフを前提とした場合の最短経路木の定義にはない“到達可能な”が加わっている。なお、無向グラフに関する第１実施形態を有向グラフと同様に、非連結なグラフに適用できるよう修正することは容易である。
【０１３１】
図１７に示すように、第２実施形態に係る生成装置２１０は、初期化部２１２と生成部２１４とを含む。初期化部２１２及び生成部２１４は、有向グラフを対象とする点、及び最短経路木生成処理の終了判定の方法が異なる点を除いて、第１実施形態における初期化部１２及び生成部１４と同様である。
【０１３２】
生成装置２１０は、例えば図１９に示すコンピュータ４０で実現することができる。コンピュータ４０の記憶部４３には、コンピュータ４０を生成装置２１０として機能させるための生成プログラム２５０が記憶される。ＣＰＵ４１は、生成プログラム２５０を記憶部４３から読み出してメモリ４２に展開し、生成プログラム２５０が有するプロセスを順次実行する。
【０１３３】
生成プログラム２５０は、初期化プロセス２５２と、生成プロセス２５４とを有する。ＣＰＵ４１は、初期化プロセス２５２を実行することで、図１７に示す初期化部２１２として動作する。また、ＣＰＵ４１は、生成プロセス２５４を実行することで、図１７に示す生成部２１４として動作する。これにより、生成プログラム２５０を実行したコンピュータ４０が、生成装置２１０として機能することになる。
【０１３４】
なお、生成プログラム２５０により実現される機能は、例えば半導体集積回路、より詳しくはＡＳＩＣ等で実現することも可能である。
【０１３５】
次に、第２実施形態に係る生成装置２１０の作用について説明する。なお、生成装置２１０で実行される最短経路木生成処理について、同心円状幅優先探索方式による最短経路木生成処理及び第１実施形態における最短経路木生成処理と同様な処理については、同一符号を付して、詳細な説明を省略する。
【０１３６】
図３４に示すメイン処理のステップＳ２１０で、初期化部２１２が、Ｇ＝（Ｖ，Ｅ）で表されるグラフＧのデータを受け付ける。以下では、グラフＧが図３５に示すグラフ、すなわち、Ｖ＝［ｖ１，ｖ２，ｖ３，ｖ４］、Ｅ＝［ｖ１→ｖ２，ｖ２→ｖ３，ｖ３→ｖ２，ｖ３→ｖ４］の場合について説明する。なお、ｖｉ→ｖｊは、頂点ｖｉから出て頂点ｖｊに入る辺を表す。初期化部２１２は、第１実施形態における最短経路木生成処理のメイン処理のステップＳ１０と同様の初期化処理を実行する。なお、第２実施形態では、有向グラフを対象とするため、頂点ｖの隣接頂点リストｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓには、頂点ｖから隣接する頂点、すなわち、頂点ｖから出た辺が入る頂点が登録される。図３６に、初期化終了時点、すなわち深さ０の最短経路木まで生成された段階の頂点オブジェクト及びｔ−頂点オブジェクトを示す。
【０１３７】
２６０Ａは頂点ｖ１の頂点オブジェクト、２６０Ｂは頂点ｖ２の頂点オブジェクト、２６０Ｃは頂点ｖ３の頂点オブジェクト、２６０Ｄは頂点ｖ４の頂点オブジェクトである。また、２６１Ａはｔ＿ｖ１１のｔ−頂点オブジェクト、２６１Ｂはｔ＿ｖ２２のｔ−頂点オブジェクト、２６１Ｃはｔ＿ｖ３３のｔ−頂点オブジェクト、２６１Ｄはｔ＿ｖ４４のｔ−頂点オブジェクトである。
【０１３８】
次に、ステップＳ２１１で、その頂点を根とする最短経路木の生成処理が未完の頂点を管理するためのリストＵｆ＿Ｖｅｒｔｉｃｅｓに、配列Ｖｅｒｔｅｘ［］に含まれる全ての頂点を追加する。次に、ステップＳ２２０で、生成部２１４が、最短経路木の深さを示す変数ｋに０を設定する。次に、ステップＳ３０で、生成部２１４が、変数ｋを１インクリメントし、次に、ステップＳ４０で、生成部２１４が、変数ｋが、最短経路木を生成する深さとして予め設定された値ｄ以下か否かを判定する。変数ｋがｄ以下の場合には、処理はステップＳ２５０へ移行する。
【０１３９】
なお、全頂点の各々から到達可能な全頂点への最短経路を求めたい場合は、第１実施形態と同様に、ｄ＝｜Ｖ｜−１とすればよい。ｄ＝｜Ｖ｜−１に設定しても、全ての頂点が直線状に接続されたグラフ以外は、リストＵｆ＿Ｖｅｒｔｉｃｅｓが［］（空リスト）になれば、変数ｋが｜Ｖ｜−１に達する前に最短経路木の生成は終了するため、効率的にも問題ない。
【０１４０】
ステップＳ２５０では、生成部２１４が、図３７に示す深さｋの処理を実行する。
【０１４１】
図３７のステップＳ２５１で、生成部２１４が、頂点ｖを根とする最短経路木の生成が完了した頂点を管理するためのリストＦ＿Ｖｅｒｔｉｃｅｓに空のリスト［］を設定する。
【０１４２】
次に、ステップＳ２５２で、生成部２１４が、リストＵｆ＿Ｖｅｒｔｉｃｅｓに、後段の処理が未処理の頂点が存在するか否かを判定する。未処理の頂点が存在する場合には、処理はステップＳ２５３へ移行する。
【０１４３】
ステップＳ２５３では、生成部２１４が、リストＵｆ＿Ｖｅｒｔｉｃｅｓに存在する未処理の頂点の中から、Ｕｆ＿Ｖｅｒｔｉｃｅｓの一番先頭に近い頂点を抽出し、処理対象の頂点ｖに設定する。次に、ステップＳ２５４で、生成部２１４が、図２２に示す頂点ｖを根とする深さｋの最短経路木生成処理を実行する。なお、第２実施形態における頂点ｖを根とする深さｋの最短経路木生成処理では、ステップＳ６１０の頂点ｖを根とする深さ１の最短経路木生成処理、及びステップＳ６２０の頂点ｖを根とする深さ２以上の最短経路木生成処理の各々が第１実施形態と異なる。
【０１４４】
まず、図３８を参照して、第２実施形態における頂点ｖを根とする深さ１の最短経路木生成処理について説明する。
【０１４５】
ステップＳ２６１１で、生成部２１４が、ｖ．ｒｉｎｇ［０］に登録されているｔ−頂点をｔ＿ｖに設定する。次に、ステップＳ６１２で、生成部２１４が、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓに、後段の処理が未処理の頂点が存在するか否かを判定する。未処理の頂点が存在する場合には、処理はステップＳ２６１２へ移行する。
【０１４６】
ステップＳ２６１２では、生成部２１４が、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈが０か否かを判定する。ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈが０の場合には、処理はステップＳ２６１３へ移行し、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈが０ではない場合には、処理はステップＳ６１３へ移行する。
【０１４７】
ステップＳ２６１３では、生成部２１４が、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈに１を設定すると共に、属性としてｖ．ｒｉｎｇ［１］を追加し、ｖ．ｒｉｎｇ［１］に空のリスト［］を設定する。
【０１４８】
次に、ステップＳ６１３で、生成部２１４が、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓに存在する未処理の頂点のうち、ｖ．ａｄｊ＿ｖｅｒｔｉｃｅｓの先頭に一番近い頂点を抽出し、頂点ｘに設定する。次に、ステップＳ６１４で、生成部２１４が、第１実施形態と同様に、頂点ｘに対応するｔ−頂点オブジェクトｔ＿ｘを生成すると共に、付随する処理を行ない、処理はステップＳ６１２に戻る。ステップＳ６１２で、未処理の頂点が存在しないと判定された場合には、頂点ｖを根とする深さ１の最短経路木生成処理を終了し、図３７に示す深さｋの処理に戻る。
【０１４９】
次に、ステップＳ２５５で、生成部２１４が、上記ステップＳ２５４で、頂点ｖを根とする最短経路木が完成したか否かを判定する。具体的には、生成部２１４は、上記ステップＳ２５４の処理の前後で、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈが変化していない場合、又は、ｖ．ｓｐｔｒｅｅ＿ｃｌｏｓｕｒｅに登録された頂点の数が｜Ｖ｜の場合に肯定判定する。ステップＳ２５５が肯定判定の場合には、処理はステップＳ２５６へ移行し、生成部２１４が、頂点ｖをリストＦ＿Ｖｅｒｔｉｃｅｓに追加する。ステップＳ２５５が否定判定の場合には、処理はステップＳ２５２に戻る。
【０１５０】
図３９及び図４０に、頂点ｖを根とする深さ１の最短経路木生成処理を終了した段階での頂点オブジェクト２６０及びｔ−頂点オブジェクト２６１を示す。頂点ｖがｖ４の場合には、上記ステップＳ２５４の処理の前後で、ｖ４．ｓｐｔｒｅｅ＿ｄｅｐｔｈが０から変化していないため、上記ステップＳ２５５で肯定判定され、上記ステップＳ２５６で、頂点ｖ４がリストＦ＿Ｖｅｒｔｉｃｅｓに追加される。
【０１５１】
上記ステップＳ２５２で、リストＵｆ＿Ｖｅｒｔｉｃｅｓに、後段の処理が未処理の頂点が存在しないと判定された場合には、処理はステップＳ２５７へ移行する。ステップＳ２５７では、生成部２１４が、リストＵｆ＿Ｖｅｒｔｉｃｅｓに登録されている頂点から、リストＦ＿Ｖｅｒｔｉｃｅｓに登録されている頂点を除く。
【０１５２】
次に、ステップＳ２５８で、生成部２１４が、リストＵｆ＿Ｖｅｒｔｉｃｅｓが空になったか否かを判定する。リストＵｆ＿Ｖｅｒｔｉｃｅｓが空になった場合には、全ての頂点について、各頂点を根とする最短経路木の生成が完了したことを表しているため、最短経路木生成処理を終了する。一方、リストＵｆ＿Ｖｅｒｔｉｃｅｓに未だ頂点が存在している場合には、処理は図３４に示すメイン処理のステップＳ３０へ移行する。
【０１５３】
次に、図４１を参照して、図２２のステップＳ６２０で実行される頂点ｖを根とする深さ２以上の最短経路木生成処理について説明する。
【０１５４】
第１実施形態における頂点ｖを根とする深さ２以上の最短経路木生成処理と同様のステップＳ５６２、Ｓ５６３、Ｓ６２１〜Ｓ６２４の処理を経て、ステップＳ５６７で肯定判定されると、処理はステップＳ２６２１へ移行する。
【０１５５】
ステップＳ２６２１では、生成部２１４が、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈがｋ−１か否かを判定する。ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈがｋ−１の場合には、処理はステップＳ５６１へ移行し、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈがｋ−１ではない場合には、処理はステップＳ６２５へ移行する。
【０１５６】
ステップＳ５６１では、生成部２１４が、ｖ．ｓｐｔｒｅｅ＿ｄｅｐｔｈにｋを設定すると共に、属性としてｖ．ｒｉｎｇ［ｋ］を追加し、ｖ．ｒｉｎｇ［ｋ］に空のリスト［］を設定する。
【０１５７】
以下、第１実施形態と同様に、ステップＳ６２５及びＳ５６９の処理が実行され、ステップＳ５６２で否定判定されると、処理は図３７に示す深さｋの処理に戻る。
【０１５８】
図４２及び図４３に、ｋ＝２についての深さｋの処理が終了した段階での頂点オブジェクト及びｔ−頂点オブジェクトを示す。ｋ＝１についての深さｋの処理が終了した段階（図３９及び図４０）から、ｔ＿ｖ１３のｔ−頂点オブジェクト２６１Ｋ、ｔ＿ｖ２４のｔ−頂点オブジェクト２６１Ｌ、及びｔ＿ｖ１３のｔ−頂点オブジェクト２６１Ｋが生成されている。また、図４４及び図４５に、ｋ＝３についての深さｋの処理が終了した段階での頂点オブジェクト及びｔ−頂点オブジェクトを示す。ｋ＝２についての深さｋの処理が終了した段階（図４２及び図４３）から、ｔ＿ｖ１４のｔ−頂点オブジェクト２６１Ｏが生成されている。
【０１５９】
ｋ＝３、ｉｄ＝１の場合、ｖ１.ｒｉｎｇ［２］にｔ＿ｖ１３が登録されているので、ｔ＿ｖ１３をさらに先に延ばしていくことになる。その際、同心円状幅優先探索方式では、ｔ＿ｖ１３に対応する頂点ｖ３の隣接頂点（ｖ２、ｖ４）を探索することになる。一方、第２実施形態では、ｔ＿ｖ１３から先に延ばして次のｔ−頂点を探索する際、第１実施形態の場合と同様に、既に生成されている最短経路木を活用するため、隣接頂点へのアクセス回数を削減することができる。
【０１６０】
以上説明したように、第２実施形態に係る生成装置によれば、有向グラフに対しても、第１実施形態と同様に、本発明を適用して、同様の効果を得ることができる。なお、無向グラフにおける隣接する頂点間の辺は、一方の頂点から出て他方の頂点へ入る辺であると共に、他方の頂点から出て一方の頂点へ入る辺であると捉えることができる。すなわち、無向グラフは、両方向へのリンクを持つ有向グラフであると捉えることができる。従って、無向グラフを対象とする第１実施形態は、有向グラフを対象とする第２実施形態の特別な場合であるといえる。
【０１６１】
なお、第１実施形態に比べ、第２実施形態は改良が施されている。例えば、前述の非連結グラフへの適用や、Ｕｆ＿Ｖｅｒｔｉｃｅｓリストなどを使うことによる不要な処理の削減である。これらのことは上記のことから、第１実施形態にも容易に適用可能である。
【０１６２】
また、第１及び第２実施形態は、単純で分かり易い幅優先探索方式を利用した上述の同心円状幅優先探索方式を基礎としており、その分かり易さ及び単純性を引き継いでいる。
【０１６３】
以下に、第１実施形態により最短経路木を生成した際の計算量を、グラフの形状毎に示す。なお、下記の６）を除いて計算量は実験的に求めたものであり、したがって、最大の計算量ではなく、平均計算量というべき計算量である。
【０１６４】
１）完全グラフ        Ｏ（｜Ｖ｜２）
２）完全二部グラフ    Ｏ（｜Ｖ｜２）
３）２次元格子        Ｏ（｜Ｖ｜２）
４）超立方体          Ｏ（｜Ｖ｜２）
５）ランダムグラフ    Ｏ（｜Ｖ｜２．２５〜２．３）
６）各部が｜Ｖ｜／４個の頂点からなる完全四部グラフ  Ｏ（｜Ｖ｜３）
【０１６５】
ランダムグラフでは、辺の数を｜Ｖ｜から｜Ｖ｜２／２まで変化させて、すなわちＯ（｜Ｅ｜）をＯ（｜Ｖ｜）からＯ（｜Ｖ｜２）まで変化させて測定した。上述のように、ここでの計算量は平均計算量というべきものであるため、従来技術との単純な比較は困難であるが、計算量の削減効果は示されている。６）では、Ｏ（｜Ｖ｜３）と計算量を要しているが、このような形態のグラフは、道路網などの通常のグラフでは現れにくい形態である。
【０１６６】
第２実施形態のように、有向グラフを対象とした場合でも、第１実施形態の場合と同様、又はそれ以上の計算量削減効果を得ることができると考えられる。なぜなら、上述したように、無向グラフは、両方向へのリンクを持つ有向グラフと捉えることができるため、有向グラフを対象とした場合の計算量は、無向グラフを対象とした場合の計算量以下となることが推測されるからである。
【０１６７】
なお、上記各実施形態では、生成プログラム５０、２５０が記憶部４３に予め記憶（インストール）されている態様を説明したが、ＣＤ−ＲＯＭやＤＶＤ−ＲＯＭ等の記憶媒体に記録された形態で提供することも可能である。
【０１６８】
以上の各実施形態に関し、更に以下の付記を開示する。
【０１６９】
（付記１）
コンピュータに、
複数の頂点と頂点間を結ぶ辺とで表されたグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する
ことを含む処理を実行させる生成方法。
【０１７０】
（付記２）
前記第２の最短経路木に含まれる頂点の子を探索することにより生成された前記第１の最短経路木に含まれる頂点に、前記第２の最短経路木に含まれる頂点の子を示す属性を付与し、
前記属性が付与された頂点が前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点となった際に、前記子に相当する頂点を示す属性が示す頂点を、前記第２の最短経路木に含まれる頂点とする
付記１記載の生成方法。
【０１７１】
（付記３）
前記グラフが重みなし有向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点から出た辺が入る頂点とする付記１又は付記２記載の生成方法。
【０１７２】
（付記４）
前記グラフが重みなし無向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点と辺で結ばれた頂点とする付記１又は付記２記載の生成方法。
【０１７３】
（付記５）
頂点についての属性を表す第１のオブジェクトと、最短経路木に含まれる頂点としての属性を表す第２のオブジェクトとを対応付けて管理する付記１〜付記３のいずれか１項記載の生成方法。
【０１７４】
（付記６）
前記第１のオブジェクトは、属性として、頂点の識別子、前記識別子が示す頂点に隣接する頂点、前記識別子が示す頂点を根とする生成済みの最短経路木の深さ、対応する第２のオブジェクト、前記生成済みの最短経路木に含まれる頂点、及び前記識別子が示す頂点からの距離毎の前記生成済みの最短経路木に含まれる頂点を含み、
前記第２のオブジェクトは、属性として、対応する頂点、最短経路木における親及び子、並びに前記第２の最短経路木に含まれる頂点の子を示す属性を含む
付記５記載の生成方法。
【０１７５】
（付記７）
複数の頂点と頂点間を結ぶ辺とで表されたグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する生成部を含む生成装置。
【０１７６】
（付記８）
前記生成部は、前記第２の最短経路木に含まれる頂点の子を探索することにより生成された前記第１の最短経路木に含まれる頂点に、前記第２の最短経路木に含まれる頂点の子を示す属性を付与し、前記属性が付与された頂点が前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点となった際に、前記子に相当する頂点を示す属性が示す頂点を、前記第２の最短経路木に含まれる頂点とする付記７記載の生成装置。
【０１７７】
（付記９）
前記グラフが重みなし有向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点から出た辺が入る頂点とする付記７又は付記８記載の生成装置。
【０１７８】
（付記１０）
前記グラフが重みなし無向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点と辺で結ばれた頂点とする付記７又は付記８記載の生成装置。
【０１７９】
（付記１１）
前記生成部は、頂点についての属性を表す第１のオブジェクトと、最短経路木に含まれる頂点としての属性を表す第２のオブジェクトとを対応付けて管理する付記７〜付記１０のいずれか１項記載の生成装置。
【０１８０】
（付記１２）
前記第１のオブジェクトは、属性として、頂点の識別子、前記識別子が示す頂点に隣接する頂点、前記識別子が示す頂点を根とする生成済みの最短経路木の深さ、対応する第２のオブジェクト、前記生成済みの最短経路木に含まれる頂点、及び前記識別子が示す頂点からの距離毎の前記生成済みの最短経路木に含まれる頂点を含み、
前記第２のオブジェクトは、属性として、対応する頂点、最短経路木における親及び子、並びに前記第２の最短経路木に含まれる頂点の子を示す属性を含む
付記１１記載の生成装置。
【０１８１】
（付記１３）
コンピュータに、
複数の頂点と頂点間を結ぶ辺とで表されたグラフにおいて、各頂点を第１の根とし、前記第１の根からの距離がＮの第１の最短経路木を生成する際、前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点であって、前記第１の根に相当する頂点に隣接する頂点を第２の根とする第２の最短経路木に含まれる頂点の子を探索する
ことを含む処理を実行させるための生成プログラム。
【０１８２】
（付記１４）
前記第２の最短経路木に含まれる頂点の子を探索することにより生成された前記第１の最短経路木に含まれる頂点に、前記第２の最短経路木に含まれる頂点の子を示す属性を付与し、
前記属性が付与された頂点が前記第１の根からの距離がＮ−１の前記第１の最短経路木に含まれる頂点となった際に、前記子に相当する頂点を示す属性が示す頂点を、前記第２の最短経路木に含まれる頂点とする
付記１３記載の生成プログラム。
【０１８３】
（付記１５）
前記グラフが重みなし有向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点から出た辺が入る頂点とする付記１３又は付記１４記載の生成プログラム。
【０１８４】
（付記１６）
前記グラフが重みなし無向グラフの場合、前記第１の根に相当する頂点に隣接する頂点を、前記第１の根に相当する頂点と辺で結ばれた頂点とする付記１３又は付記１４記載の生成プログラム。
【０１８５】
（付記１７）
頂点についての属性を表す第１のオブジェクトと、最短経路木に含まれる頂点としての属性を表す第２のオブジェクトとを対応付けて管理する付記１３〜付記１６のいずれか１項記載の生成プログラム。
【０１８６】
（付記１８）
前記第１のオブジェクトは、属性として、頂点の識別子、前記識別子が示す頂点に隣接する頂点、前記識別子が示す頂点を根とする生成済みの最短経路木の深さ、対応する第２のオブジェクト、前記生成済みの最短経路木に含まれる頂点、及び前記識別子が示す頂点からの距離毎の前記生成済みの最短経路木に含まれる頂点を含み、
前記第２のオブジェクトは、属性として、対応する頂点、最短経路木における親及び子、並びに前記第２の最短経路木に含まれる頂点の子を示す属性を含む
付記１７記載の生成プログラム。
【符号の説明】
【０１８７】
１０、２１０ 生成装置
１２、２１２ 初期化部
１４、２１４ 生成部
４０ コンピュータ
４１ ＣＰＵ
４２ メモリ
４３ 記憶部
５０、２５０ 生成プログラム
６０、２６０ 頂点オブジェクト
６１、２６１ ｔ−頂点オブジェクト
【図１】
0006520362.tif 000002
【図２】
0006520362.tif 000003
【図３】
0006520362.tif 000004
【図４】
0006520362.tif 000005
【図５】
0006520362.tif 000006
【図６】
0006520362.tif 000007
【図７】
0006520362.tif 000008
【図８】
0006520362.tif 000009
【図９】
0006520362.tif 000010
【図１０】
0006520362.tif 000011
【図１１】
0006520362.tif 000012
【図１２】
0006520362.tif 000013
【図１３】
0006520362.tif 000014
【図１４】
0006520362.tif 000015
【図１５】
0006520362.tif 000016
【図１６】
0006520362.tif 000017
【図１７】
0006520362.tif 000018
【図１８】
0006520362.tif 000019
【図１９】
0006520362.tif 000020
【図２０】
0006520362.tif 000021
【図２１】
0006520362.tif 000022
【図２２】
0006520362.tif 000023
【図２３】
0006520362.tif 000024
【図２４】
0006520362.tif 000025
【図２５】
0006520362.tif 000026
【図２６】
0006520362.tif 000027
【図２７】
0006520362.tif 000028
【図２８】
0006520362.tif 000029
【図２９】
0006520362.tif 000030
【図３０】
0006520362.tif 000031
【図３１】
0006520362.tif 000032
【図３２】
0006520362.tif 000033
【図３３】
0006520362.tif 000034
【図３４】
0006520362.tif 000035
【図３５】
0006520362.tif 000036
【図３６】
0006520362.tif 000037
【図３７】
0006520362.tif 000038
【図３８】
0006520362.tif 000039
【図３９】
0006520362.tif 000040
【図４０】
0006520362.tif 000041
【図４１】
0006520362.tif 000042
【図４２】
0006520362.tif 000043
【図４３】
0006520362.tif 000044
【図４４】
0006520362.tif 000045
【図４５】
0006520362.tif 000046