迪杰斯特拉算法(D算法)
#include<iostream>
#include<vector>
#include<limits>
using namespace std;
void ShortestPath_Dijkstra(vector<vector<int>>& arc, int numVex, vector<int>& Patharc, vector<int>& ShortPath)
{
int k=0, MIN=INT_MAX;
vector<bool>flag(numVex);
for (int i = 0; i < numVex; i++)
{
flag[i] = false;
ShortPath[i] = arc[0][i];
}
flag[0] = true;
ShortPath[0] = 0;
for (int v = 1; v < numVex; v++)
{
MIN = INT_MAX;
for (int j = 0; j < numVex; j++)
{
if (!flag[j] && ShortPath[j] < MIN)
{
MIN = ShortPath[j];
k = j;
}
}
flag[k] = true;
for (int i = 0; i < numVex; i++)
{
if (!flag[i] && arc[k][i] != INT_MAX && (arc[k][i] + MIN) < ShortPath[i])
{
ShortPath[i] = arc[k][i] + MIN;
Patharc[i] = k;
}
}
}
}
int main()
{
//创建图
int numVex,numEdge;
cout << "请输入图中的点数和边数:" << endl;
cin >> numVex >> numEdge;
vector<vector<int>>arc(numVex, vector<int>(numVex,INT_MAX));
cout << "请输入变得信息:" << endl;
for (int i = 0; i < numEdge; i++)
{
int e1, e2, weight;
cin >> e1 >> e2 >> weight;
arc[e1][e2] = weight;
arc[e2][e1] = weight;
}
//寻找顶点0到其他顶点的最短距离
vector<int>Patharc(numVex);
vector<int>ShortPath(numVex);
ShortestPath_Dijkstra(arc, numVex, Patharc, ShortPath);
for (int i = 1; i < numVex; i++)
{
cout << "节点0到节点" << i << "的最短路径为:" << ShortPath[i] << endl;
}
return 0;
}
-
弗洛伊德算法(F算法)
#include<iostream>
#include<vector>
#define MAX 0x0f0f0f0f
using namespace std;
void ShortestPath_Floyd(int numVex,vector<vector<int>>& D, vector<vector<int>>& P)
{
for (int k = 0; k < numVex; k++)
{
for (int v = 0; v < numVex; v++)
{
for (int w = 0; w < numVex; w++)
{
if (D[v][w] > D[v][k] + D[k][w])
{
D[v][w] = D[v][k] + D[k][w];
P[v][w] = P[v][k];
}
}
}
}
}
int main()
{
int numVex, numEdge;
cout << "请输入图中的点数和边数:" << endl;
cin >> numVex >> numEdge;
vector<vector<int>>D(numVex, vector<int>(numVex, MAX));
vector<vector<int>>P(numVex, vector<int>(numVex));
cout << "请输入边的信息:" << endl;
for (int i = 0; i < numEdge; i++)
{
int e1, e2, weight;
cin >> e1 >> e2 >> weight;
D[e1][e2] = weight;
D[e2][e1] = weight;
}
for (int v = 0; v < numVex; v++)
{
D[v][v] = 0;
for (int w = 0; w < numVex; w++)
{
P[v][w] = w;
}
}
//F算法 (寻找各个顶点之间的最短距离)
ShortestPath_Floyd(numVex,D, P);
cout << "各个顶点之间的最短距离为:" << endl;
for (int i = 0; i < numVex; i++)
{
for (int j = 0; j < numVex; j++)
{
cout << D[i][j] << " ";
}
cout << endl;
}
return 0;
}