最短経路問題
最短パス
あなたが実行可能なパスを取得したい場合は007で問題の一部は、最短の道ルートは何ですか?
シングルソースの最短パスは図に権利はありません。
レビュー:右のマップ。右:図番号に関連する縁部と円弧は、重みは、頂点から発現させることができる別の頂点から/に要するなど;
アルゴリズムのアイデア:
ノードは、各層を横断しているBFSアルゴリズムにより、現在層のノードの特性を決定する、(007ショアスキップ場合、例えば)ノードが要件端を満たす、この層を分析するステップと、各アルゴリズムBFS用これは、最短経路である必要があり、要件を満たす端に現在のレイヤをスキャン。
したがって、我々は、現在の層間隔(距離)またはパス(経路)を維持するために、アレイ等、/マップデータ構造を取ることができるだけでなく、独自のクラスを作成することができ、BFSサイクルを必要とします。
前篇007:HTTPS:?//editor.csdn.net/md/情報でarticleID = 104146261
007深化:007が何回もジャンプ、またはパスを見つけるための最短経路の必要性を求めている007
これらのコードを解決するために、所望の経路ならば、パスが取得できHashMapを以下トラバース。
注:パスは、親ノードのオブジェクトに格納された各ノードにおける最短経路であり、特定の経路を取得するため、トラバース直接終了時間に達しました。
public int shortestWay(Node node) {
HashMap<String, Integer> dist = new HashMap<>();
HashMap<Node, Node> path = new HashMap<>();
Queue<Node> queue = new Queue<>();
queue.add(node);
dist.put(node.name, 0);
path.put(node, null);
Node endNode = null;
while (queue.isEmpty()) {
Node node1 = queue.peek();
for (Node nearNode : node1.nearNode()) {
if (!dist.containsKey(nearNode.name)) {
dist.put(nearNode.name, dist.get(node1.name) + 1);
path.put(nearNode, node1);
queue.add(nearNode);
if ((Math.abs(nearNode.x) - xEdge) < 1 || (Math.abs(nearNode.y) - yEdge) < 1) {
endNode = nearNode;
break;
}
}
}
}
if (endNode == null) throw new RuntimeException("can't jump to edge");
return dist.get(endNode.name);
}
題し図のシングルソースの最短経路アルゴリズム###
ダイクストラ法
核となるアイデア:最短パスアルゴリズムに基づいが許可されていない、ソースポイントS及びVの現在のコレクションを増加させる権利は、宛先値に達する電力値/電流経路における最短経路/パスは重量よりも大きい、重量が非最小量を記載プロセスにおいて、頂点V最短経路の収集を継続し、そう一定重量を減少させることは、ときにループを抜ける、即ち、最小重量ケース;
言い換えれば:A-> ... - > B-> ... - > CのC Aは、次いで、Bこの経路AもBにAからの最短経路点Bにおけるこの経路を通る経路の最短経路です、すなわち:すべてのノードへの最短経路は最短経路通過中に含まれます
そうS = {S +ソースは、最短経路の頂点VIことが決定されています}
任意の経路のためのV、定義DIST [V]はVへの最短経路長sである。しかし、これが唯一の中に含まれる頂点経路に供されます。
そして、経路生成昇順の場合:
- 実際の最短パスは頂点あまりにのみの中に含まれている必要があります
- 最小DISTの各非封入に含まれる選択された頂点
必要な隣接行列/隣接リストに基づいて:
レビューします。https://blog.csdn.net/qq_32193775/article/details/104133695
//伪代码如下
public void dijkstra(int v){
while(true){
}
}
コードは以下の通りであります:
public int[] dijkstra(int v) {
if (v < 0 || v >= numOfVexs)
throw new ArrayIndexOutOfBoundsException();
boolean[] st = new boolean[numOfVexs];// 默认初始为false
int[] distance = new int[numOfVexs];// 存放源点到其他点的矩离
for (int i = 0; i < numOfVexs; i++)
for (int j = i + 1; j < numOfVexs; j++) {
if (edges[i][j] == 0) {
edges[i][j] = Integer.MAX_VALUE;
edges[j][i] = Integer.MAX_VALUE;
}
}
for (int i = 0; i < numOfVexs; i++) {
distance[i] = edges[v][i];
}
st[v] = true;
// 处理从源点到其余顶点的最短路径
for (int i = 0; i < numOfVexs; ++i) {
int min = Integer.MAX_VALUE;
int index=-1;
// 比较从源点到其余顶点的路径长度
for (int j = 0; j < numOfVexs; ++j) {
// 从源点到j顶点的最短路径还没有找到
if (st[j]==false) {
// 从源点到j顶点的路径长度最小
if (distance[j] < min) {
index = j;
min = distance[j];
}
}
}
//找到源点到索引为index顶点的最短路径长度
if(index!=-1)
st[index] = true;
// 更新当前最短路径及距离
for (int w = 0; w < numOfVexs; w++)
if (st[w] == false) {
if (edges[index][w] != Integer.MAX_VALUE
&& (min + edges[index][w] < distance[w]))
distance[w] = min + edges[index][w];
}
}
return distance;
}