Моя программа читает входные данные из текстового файла в порядке
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.Каждый графовый узел затем имеет свой собственный связанный список, который указывает на соседние узлы в графе.
Кто-нибудь может шаг за шагом рассказать мне о реализации алгоритма?Заранее спасибо.