Dijksta算法在邻接矩阵中找不到路径
Dijksta's Algorithm not finding path in Adjacency Matrix
由于某种原因,当我在随机生成的矩阵上运行dijkstra算法时,它无法找到所有节点之间的路径,即使很明显它是一个连通图。我已经把图表打印出来了,它们总是按照这个表格
0--2--3
| | |
4--5--6
| | |
7--8--9
现在我只使用3*3矩阵,并试图使其正常工作。下面的代码生成一个具有9个节点的邻接矩阵,并随机生成一个介于1和3之间的数字来表示边的权重。我用4表示无穷大。源被硬编码为0和numOfVertices 9
#include<iostream>
#include <time.h>
#include <math.h>
#define INFINITY 4
#define V 9
using namespace std;
class Dijkstra{
private:
int predecessor[20],distance[20];
bool mark[20];
int source;
int destination;
int numOfVertices;
char gameMode;
public:
int adjMatrix[9][9];
void read();
void initialize();
void setSource(int k);
int getClosestUnmarkedNode();
void calculateDistance();
void output();
int randomEdge();
int randomNode();
void printPath(int);
};
void Dijkstra::read(){
numOfVertices = 4;
for(int i = 0; i < numOfVertices;i++){
for(int j = 0; j < numOfVertices;j++){
if(i == j)
adjMatrix[i][j] = 0;
else if(j >= i){
if(j == i + 1 || j == i - 1 || j == i + sqrt((double)numOfVertices)|| j == i - sqrt((double)numOfVertices))
adjMatrix[i][j] = randomEdge();
else
adjMatrix[i][j] = 4;
if((i % ((int)sqrt((double)numOfVertices)) == ((int)sqrt((double)numOfVertices)) - 1) && j == i + 1)
adjMatrix[i][j] = 4;
}
else
adjMatrix[i][j] = adjMatrix[j][i];
cout<<adjMatrix[i][j]<< " ";
}
cout<< "n";
}
source = 0;
}
void Dijkstra::initialize(){
for(int i=0;i<numOfVertices;i++) {
mark[i] = false;
predecessor[i] = -1;
distance[i] = INFINITY;
}
distance[source]= 0;
}
int Dijkstra::getClosestUnmarkedNode(){
int minDistance = INFINITY;
int closestUnmarkedNode = 0;
for(int i=0;i<numOfVertices;i++) {
if((!mark[i]) && ( minDistance >= distance[i])) {
minDistance = distance[i];
closestUnmarkedNode = i;
}
}
return closestUnmarkedNode;
}
void Dijkstra::calculateDistance(){
initialize();
int minDistance = INFINITY;
int closestUnmarkedNode;
int count = 0;
while(count < numOfVertices) {
closestUnmarkedNode = getClosestUnmarkedNode();
mark[closestUnmarkedNode] = true;
for(int i=0;i<numOfVertices;i++) {
if((!mark[i]) && (adjMatrix[closestUnmarkedNode][i]>0) ) {
if(distance[i] > distance[closestUnmarkedNode]+adjMatrix[closestUnmarkedNode][i]) {
distance[i] = distance[closestUnmarkedNode]+adjMatrix[closestUnmarkedNode][i];
predecessor[i] = closestUnmarkedNode;
}
}
}
count++;
}
}
void Dijkstra::printPath(int node){
if(node == source)
cout<<node<<"..";
else if(predecessor[node] == -1)
cout<<"No path from "<<source<<"to "<<node<<endl;
else {
printPath(predecessor[node]);
cout<<node<<"..";
}
}
void Dijkstra::output(){
for(int i=0;i<numOfVertices;i++) {
if(i == source)
cout<<source<<".."<<source;
else
printPath(i);
cout<<"->"<<distance[i]<<endl;
}
}
int Dijkstra::randomEdge(){
return rand() % 3 + 1;
}
void Dijkstra::setSource(int k){
source = k;
}
int main(int argc, char** argv){
Dijkstra G;
G.read();
G.calculateDistance();
G.output();
int k;
cin>> k;
exit(0);
}
您使用4表示无限距离。。。但是4是沿着有效路径容易到达的距离。此代码拒绝任何总距离>=4的路径,因为每个节点从距离源最多4(即不可达)的距离开始。
相关文章:
- CMake导出的库-在客户端应用程序中找不到include/Lib路径
- GNuPlot.exe找不到用于用 C++ 编写的路径
- 找不到 windows.winmd – 如果指定了路径,错误会乘以
- 运行可执行文件时找不到共享库,即使共享库存在于指定的路径中
- 为什么 cmake findBoost 找不到系统提升路径?
- C++流找不到相对路径
- 错误53:找不到文件,而是路径中存在所有DLL
- 使用Cmake时,Emscripten找不到全局路径
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 在英特尔C++编译器 (Linux) 的配置搜索路径中找不到文件可执行文件
- 即使定义了搜索路径,也找不到自定义共享库
- Windows找不到DLL在路径中的目录中以为其
- makefile 找不到来自 -I 包含路径的头文件
- VS2012:“找不到资源编译器DLL.请确保路径正确.”
- Maven NAR插件:在路径上找不到DLL依赖项
- G++ 找不到库,除非它是完整路径
- 在 Visual C++ 系统调用的路径中找不到可执行文件
- Dijksta算法在邻接矩阵中找不到路径
- Qt iOS版本找不到路径为的标头
- 在Qt中的.pro文件中找不到路径