使用邻接矩阵的 Dijkstra 算法找不到从每个节点到每个其他节点的正确距离/路径
Dijkstra's Algorithm using Adjacency Matrix not finding correct distance/path from each node to every other node
我正试图编写一个程序,使用邻接矩阵构建一个图,然后使用Dijkstra算法找到从每个节点到其他节点的最短路径。我的程序是最新的,不能每次都找到正确的最短路径。我也需要追踪路径,但我甚至不确定从哪里开始。
class GraphD
{
public:
GraphD();
void buildGraph(ifstream &infile);
void insertEdge(int from, int to, int distance);
void findShortestPath();
private:
static const int MAXNODES = 101;
static const int infinity = 2147483647;
struct TableType
{
bool visited;
int dist;
int path;
};
int C[MAXNODES][MAXNODES]; // holds adjacency matrix
int size;
TableType T[MAXNODES][MAXNODES]; // for dijkstra's algorithm
};
#include "GraphD.h"
GraphD::GraphD()
{
size = 0;
for(int i = 1; i < MAXNODES; i++)
{
for(int j = 1; j < MAXNODES; j++)
{
C[i][j] = infinity;
T[i][j].dist = infinity;
T[i][j].visited = false;
T[i][j].path = 0;
}
}
}
void GraphD::buildGraph(ifstream &infile)
{
string line;
if(getline(infile, line))
{
size = atoi(line.c_str());
for(int i = 1; i <= size; i++)
{
getline(infile, line);
data[i] = line;
}
int vertex1, vertex2, distance;
while(getline(infile, line))
{
stringstream edge(line);
edge >> vertex1 >> vertex2 >> distance;
if(vertex1 == 0)
break;
insertEdge(vertex1, vertex2, distance);
}
for(int i = 1; i <= size; i++)
{
C[i][i] = 0;
}
}
}
void GraphD::insertEdge(int from, int to, int distance)
{
C[from][to] = distance;
}
void GraphM::findShortestPath()
{
for(int source = 1; source <= size; source++)
{
T[source][source].dist = 0;
for(int i = 1; i <= size; i++)
{
int v = 0;
int shortestDistance = infinity;
for(int j = 1; j <= size; j++)
{
if((C[source][j] < shortestDistance) && !T[source][j].visited)
{
shortestDistance = C[source][j];
v = j;
}
}
T[source][v].visited = true;
for(int w = 1; w <= size; w++)
{
if(!T[v][w].visited)
{
T[v][w].dist = min(T[v][w].dist, T[source][v].dist + C[v][w]);
}
}
}
}
}
将无穷大值设置为1'000'000'000(或类似的smth),因为当您使用MAX_INT值时,此处会出现整数溢出
T[v][w].dist = min(T[v][w].dist, T[source][v].dist + C[v][w]);
此外,我认为你应该更换代码的以下部分
if(!T[v][w].visited)
{
T[v][w].dist = min(T[v][w].dist, T[source][v].dist + C[v][w]);
}
到下一个
if(!T[source][w].visited)
{
T[source][w].dist = min(T[source][w].dist, T[source][v].dist + C[v][w]);
}
因为你需要从顶点源找到到顶点W的距离,而不是V。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 反向给定链表中的K节点
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 如何找到2个单链表的公共节点
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 将头连接到链表中的其他节点
- 如何向其他节点发出信号,表明主节点没有更多工作可用
- 我可以将第三行的节点更改为node_new还是其他
- 找到其他节点的最快方法
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- 使用邻接矩阵的 Dijkstra 算法找不到从每个节点到每个其他节点的正确距离/路径
- 在C/ c++中,链表只有头指针分配在堆栈中,其他节点分配在堆中.这可能导致内存泄漏
- map是否锁定其节点以防止其他进程删除它们