/*
0 1 10
0 3 30
0 4 100
3 4 60
3 2 20
1 2 50
2 4 10
*/
//Geeksun 2018.06.20
#include <iostream>
#include <String>
using namespace std;
const int maxSize = 10;
const int maxNum = 99999;
class MyGraph
{
public:
MyGraph(char str[], int vertexNum, int arcNum);
~MyGraph() {};
friend void Dijstra(MyGraph G, int v);
private:
int arc[maxSize][maxSize];
string vertex[maxSize];
int vertexNum, arcNum;
};
MyGraph::MyGraph(char str[], int vertexNum, int arcNum)
{
this->arcNum = arcNum;
this->vertexNum = vertexNum;
for (int i = 0;i < vertexNum;i++)
{
vertex[i] = str[i];
}
for (int i = 0;i < maxSize;i++)
{
for (int j = 0;j < maxSize;j++)
{
if (i == j)
{
arc[i][j] = 0;
}
else
{
arc[i][j] = maxNum;
}
}
}
for (int k = 0;k < arcNum;k++)
{
int i, j, weight;
cin >> i >> j >> weight;
arc[i][j] = weight;
}
}
void Dijstra(MyGraph G, int v)
{
int num = 1;
string path[maxSize];
int S[maxSize];
int dist[maxSize];
for (int i = 0;i < G.vertexNum;i++)
{
dist[i] = G.arc[v][i];
if (dist[i] != maxNum)
{
path[i] = G.vertex[v] + "->" + G.vertex[i];
cout << path[i] << "----" << dist[i] << endl;
}
else
{
path[i] = "";
}
}
S[0] = v;
dist[v] = maxNum;
int i, k;
while (num < G.vertexNum)
{
for (i = 0, k = 0;i < G.vertexNum;i++)
{
if (dist[i] < dist[k] && dist[i] != 0)
{
k = i;
}
}
S[num++] = k;
for (int i = 0;i < G.vertexNum;i++)
{
if (dist[i] > dist[k] + G.arc[k][i])
{
dist[i] = dist[k] + G.arc[k][i];
path[i] = path[k] + "->" + G.vertex[i];
cout << path[i] << "----" << dist[i] << endl;
}
}
dist[k] = 0;
}
}
int main()
{
char vertex[6] = "01234";
MyGraph myGraph(vertex, 5, 7);
Dijstra(myGraph, 0);
return 0;
}
最短路径——Dijkstra算法
最新推荐文章于 2022-09-24 14:03:02 发布