Алгоритм Дейксты не находит путь в матрице смежности

По какой-то причине, когда я запускаю алгоритм Дейкстры на моей случайно сгенерированной матрице, он не находит пути между всеми узлами, хотя ясно, что это связный граф. Я распечатал графики, и они всегда имеют такую ​​форму.

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);
}

person Anthony Porter    schedule 26.11.2013    source источник
comment
Не могли бы вы опубликовать минимально полный пример?   -  person Beta    schedule 26.11.2013
comment
@Beta - лучший способ опубликовать этот минимальный пример, чтобы просто отредактировать мой пост и добавить его? или есть другой способ   -  person Anthony Porter    schedule 26.11.2013
comment
Редактировать свой пост - правильный путь.   -  person Beta    schedule 26.11.2013
comment
извините, это заняло так много времени, мне потребовалось некоторое время, чтобы понять, что мне нужно было вставить код, а затем отформатировать его, а не отформатировать область и вставить код внутри нее.   -  person Anthony Porter    schedule 26.11.2013
comment
Это не минимально.   -  person Beta    schedule 26.11.2013
comment
хорошо, я работаю над сокращением его сейчас. Есть ли какие-либо другие проблемы, препятствующие тому, чтобы он соответствовал определению «минимальный»?   -  person Anthony Porter    schedule 26.11.2013
comment
Не похоже, чтобы вы шли по ссылке. Я предлагаю вам удалить вызов rand(), чтобы поведение можно было повторить, а также убрать выбор размера графика и жестко запрограммировать наименьший график, вызывающий ошибку.   -  person Beta    schedule 26.11.2013
comment
Я взял семя из вызова rand(), поэтому он будет повторять ту же матрицу. Я удалил выбор размера и жестко запрограммировал наименьший экземпляр, который вызывает ошибку.   -  person Anthony Porter    schedule 26.11.2013


Ответы (1)


Вы используете 4 для представления бесконечного расстояния... но 4 - это расстояние, которое легко достичь по допустимому пути. Этот код отклоняет любой путь с общим расстоянием >=4, потому что каждый узел начинается с расстояния не более 4 (т.е. недостижим) от источника.

person Beta    schedule 26.11.2013