Как реализовать алгоритм Дейкстры со списками смежности - PullRequest
0 голосов
/ 14 мая 2018

Моя программа читает входные данные из текстового файла в порядке

A
B 
C

A B 10
A C 5
B A 3
B C 2
C A 4
C B 1

и сохраняет данные в графике, который представлен списком смежности.Я хочу написать программу, которая находит кратчайший путь от A до всех других узлов, используя алгоритм Дейкстры.

Я посмотрел несколько видео, но все еще не мог понять, как реализовать алгоритм, поскольку в примерах используются графики, которые представлены в виде матриц смежности.Ниже приведена программа:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <locale>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

#define INFINITE -1

/* node */
struct Node
{
    char key;
    int distance;
    Node *next;
};

/* GraphNode */
struct GraphNode
{
    char key;
    Node *listpointer;
};

/* Add nodes to the front of the list */
void AddNodeToFront(Node*& listpointer, char newkey, int newdistance)
{
   Node *temp;
   temp = new Node;
   temp->key = newkey;
   temp->distance=newdistance;
   temp->next = listpointer;
   listpointer = temp;
}

/* printf LLnodes */
void PrintLLnodes(Node*& listpointer)
{
    Node *temp;
    temp = listpointer;
    while(temp!=NULL)
    {
        printf("to node %c dist: %d \n", temp->key, temp->distance);
        temp=temp->next;
    }
 }

/* Implement the Graph class  */
class Graph
{
    private:
        vector<GraphNode> adjlist;
        int totalgraphnodes;
    public:
        Graph(){totalgraphnodes = 0;}
        ~Graph(){}
        void AddNewGraphNode(char newgraphnode);
        void AddNewEdgeBetweenGraphNodes(char A, char B, int distance);
        void PrintAllGraphNodesWithCosts();
        void DijkstrasAlgorithm(char sourcenode);
        int GetTotalNodes() { return totalgraphnodes; }
};

/* graph class functions */
void Graph::AddNewGraphNode(char newgraphnode){
    totalgraphnodes++;
    GraphNode temp;
    temp.key=newgraphnode;
    temp.listpointer = NULL;//important
    adjlist.push_back(temp);
}

void Graph::AddNewEdgeBetweenGraphNodes(char A, char B, int distance)
{
     //find which node A is
     int a;
     for (a = 0;adjlist.size();a++)
     {
         if (A == adjlist[a].key) break;
     }
     AddNodeToFront(adjlist[a].listpointer, B, distance);
}

void Graph::PrintAllGraphNodesWithCosts()
{
     for (unsigned int a = 0;a < adjlist.size();a++){
         printf("From Node %c: \n", adjlist[a].key);
         PrintLLnodes(adjlist[a].listpointer);
     }  
}

**// implement Dijkstra's Algorithm
void Graph::DijkstrasAlgorithm(char sourcenode)**
{
    int distance[adjlist.size()];
    char state[adjlist.size()];

    // setting the initial distance and state of the first node
    distance[0] = 0;
    state[0] = 'p';

    // assigning all distance and state to temp and infinite
    for(int i = 1; i <= adjlist.size(); i++)
    {
        distance[i] = INFINITE;
        state[i] = 't';
    }

    // get the sourcenode from the adjlist in Graph
    unsigned int a;
    for(a = 0; a <= adjlist.size(); a++)
    {
        if(sourcenode == adjlist[a].key) { break; } // break when found 'A'
    }

    // assign sourcenode listpointer to current
    Node *current;
    current = adjlist[a].listpointer;

    bool stilltempvertex = true;
    while(stilltempvertex) {}   
}

/* declare a new Graph */
Graph mygraph;
main( /*int argc, char** argv */)
{ 

    /* call Dijkstra  */
    mygraph.DijkstrasAlgorithm('A'); //always from A in this program

    /* Print answer in the required format */
}

Что касается реализации, все узлы и ребра читаются правильно (я пропустил некоторый код для обеспечения читабельности, но у mygraph есть узлы A, B, C исоответствующие ребра.), просто я не могу понять, как правильно реализовать алгоритм для этого.

Узлы считываются из файла и сохраняются в векторном ajdlist.Каждый графовый узел затем имеет свой собственный связанный список, который указывает на соседние узлы в графе.

Кто-нибудь может шаг за шагом рассказать мне о реализации алгоритма?Заранее спасибо.

...