グラフは重み付けされておらず、HashSets neighbours[] の配列の要素はノード neighbours[1] はノード 1 (0 から始まることに注意してください) であり、一意の隣接ノードは 2 3 4 5 となります (したがって、neighbours[5] 1) が含まれます。そして、理論をはるかに超えるアルゴリズムを取得できないため、多大な助けを借りて行った次の方法があります。返される数値は、グラフ内の 2 つのノード間の平均距離である必要があります。
次のグラフがあると想像してください (ノード: in_links | out_links; neighbours[] には、ノード 0 に 0 ループが含まれておらず、前述のように重複もありません。)
0: 0 0 0 | 0 0 0 1 1 1 2 3 5 6 7 7 8 8 9 9 11
1: 0 0 0 | 2 2 3 4 4 5 6 8
2: 0 1 1 | 3
3: 0 1 2 | 4 9
4: 1 1 3 | 5 12
5: 0 1 4 | 6 7 10
6: 0 1 5 | 10 11 12
7: 0 0 5 |
8: 0 0 1 | 10
9: 0 0 3 | 12
10: 5 6 8 | 11
11: 0 6 10 |
12: 4 6 9 |
そして、この自明なグラフでは、返される距離は 5.781686749230769E8 ?!?! です。コード:
public double getAvgDistance() {
double total = 0;
int[] dist = new int[n];
ArrayList<Integer> Q = new ArrayList<Integer>();
int tmp, index = 0, w = 0;
for (int u=0; u<n; u++) {
System.out.print("Avg Dist at "+u+"\r");
// Initialise Q and dist for this iteration
for (int v=u+1; v<n; v++) {
Q.add(v);
if (neighbours[u].contains(v)) {
dist[v] = 1;
} else {
dist[v] = Integer.MAX_VALUE;
}
}
while (!Q.isEmpty()) {
tmp = dist[0];
for (int e=1; e<Q.size(); e++) {
if (dist[e] < tmp) {
w = Q.get(e);
tmp = dist[w]; // smallest dist is for this element w so far
index = e;
}
}
Q.remove(index);
for (int z : neighbours[w]) {
if ( Q.contains(z)
&& (dist[w]+1 < dist[z]) ) {
dist[z] = dist[w]+1;
}
}
} // while end
for (int v = u+1; v < n; v++ ) {
total += dist[v];
}
} // for 0-n end
return total /= (double)(n*(n-1)/2);
}
私は実数のキャストや印刷の経験があまりないので、それらと関係があることを願っています! すべてのコメントを歓迎