私は、小さな世界 (無向グラフ) で、距離の長い接続が、指定されたノード間のパスの長さをどのように短縮できるかを研究しています。基本的に、リンクされたリストの配列があります。配列内の各セクションは、いずれかの側の 1 番目と 2 番目のネイバーにリンクされ、いくつかのランダムな接続が実装されます (隣接リストの作成)。
今度は、アレイ内の各スポットで BFS を実行して、アレイ内のスポットから別のスポットに移動するのに何回移動する必要があるかを確認する必要があります。
たとえば、これは配列の最初の 9 つのスポットがどのように見えるかです
[1, 2]
[0, 2, 3]
[0, 1, 3, 4]
[1, 2, 4, 5]
[2, 3, 5, 6]
[3, 4, 6, 7]
[4, 5, 7, 8, 114]
[5, 6, 8, 9]
[6, 7, 9, 10]
[7, 8, 10, 11]
配列のスポット 0 は 1 と 2 に隣接していることがわかります。反対側には何もないからです。スポット 6 には、スポット 114 への長距離接続の 1 つがあります。
これは、いくつかのエラーが発生する bfs amd im での私の試みです。まず見た目はどう思いますか?しかし、行でヌルポインター例外を取得しています
u = q.remove();
ヌルポインタ例外。理由は?あなたが今等しくあるべきものは1です。しかし、なぜそれがうまくいかないのかわかりません。それが機能しているかどうかを確認するためにいくつかの印刷を行い、addAllの後にq = [1、2]を印刷したとき、q.remove = 1を印刷しましたが、何らかの理由でプログラムが停止しました!
public static int bfs(List<Integer>[] smallWorld, int start){
int distance = 0;
int size = smallWorld.length;
//for each location in smallWorld do a bfs to every other location
int u;
int white = 0, grey = 1, black = 2;
int [] color, d, pie;
Queue <Integer> q = new <Integer> LinkedList();
color = new int [size];
d = new int [size];
pie = new int [size];
for( int x = 0; x < size; x++){
color[x] = white;
d[x] = -1;
pie[x] = -1;
}
color[start] = grey;
d[start] = 0;
pie[start] = -1;
q.addAll(smallWorld[start]); //enqueue the adjacent items
while(q != null){
u = q.remove();
for(int v = 0; v < smallWorld[u].size(); v++){ //for every vertex u is adjacent to
if(color[v] == white){
color[v] = grey;
d[v] = d[u] + 1;
pie[v] = u;
q.addAll(smallWorld[v]);
}
}
color[u] = black;
}
return distance;
}
みんなありがとう!