グラフの頂点でマークが付いている頂点数を数える
Posted: 2014年1月12日(日) 20:18
大学の講義の過去問で分からないものがあります。
問題
次のようなものを考えました。
しかしこれでは再帰呼び出しを行ったときに同じ頂点同士を再帰し続けて無限ループになってしまうと思います。
例)頂点0のneighbor[0]は頂点1でそれに対して再帰呼び出しをする。
頂点1のneighbor[0]は頂点0でそれに対して再帰呼び出しをする。
これの繰り返しが起こる。
前の授業ではすべての頂点にマークを付けるというプログラムを作りました。
そのときは訪問した頂点はtrueにできるので訪問済みであればreturnをしました。
ですが今回の場合はマークがあらかじめ付いているのでマークが付いていればreturnというわけにはいきません。
どうしたらよいのか分からないのでご教授お願いします。
問題
//グラフの頂点を次のVertexクラスで表現する。
public class Vertex {
public boolean mark; //マーク
public int degree; //隣接頂点の個数
public Vertex neighbor[]; //最初のdegree個の要素が隣接頂点を参照
}
//Vertexクラスの次のメソッドを完成させよ。
int numberOfMarkedNeighbors()
//隣接頂点のうち、markの値がtrueであるものの個数を数えて値とする。
int numberOfMarkedNeighbors(Vertex v){
int result = 0;
if(v.marked){
result++;
}
for(int i = 0; i < c.degree; i++) {
result = result + numberOfMarkedNeighbors(v.neighbor[i]);
}
return result;
}
例)頂点0のneighbor[0]は頂点1でそれに対して再帰呼び出しをする。
頂点1のneighbor[0]は頂点0でそれに対して再帰呼び出しをする。
これの繰り返しが起こる。
前の授業ではすべての頂点にマークを付けるというプログラムを作りました。
そのときは訪問した頂点はtrueにできるので訪問済みであればreturnをしました。
ですが今回の場合はマークがあらかじめ付いているのでマークが付いていればreturnというわけにはいきません。
どうしたらよいのか分からないのでご教授お願いします。