/*
单源有权图的最短路径,迪杰斯特拉算法
*/
# include<iostream>
# include<string>
using namespace std;
# define MAX 30
int dist[MAX];
int path[MAX];
bool sure[MAX];
// 图的结构
struct Matrix{
char vex[MAX];
int arc[MAX][MAX];
int vexnum, arcnum;
};
// 初始化DJS
void initDjs(int * d, int * p, bool * v){
for (int i = 0; i < MAX; i++){
dist[i] = 214647;
path[i] = -1;
sure[i] = false;
}
}
// 定位顶点位置
int location(Matrix * g, char data){
for (int i = 0; i < g->vexnum; i++){
if (g->vex[i] == data)
return i;
}
return -1;
}
// 创建邻接矩阵
void createMatrix(Matrix * g){
char data1, data2;
int weight;
cout << "请输入顶点数和边数:" << endl;
cin >> g -> vexnum >> g -> arcnum;
cout << "请输入各个顶点的值: ";
for(int i = 0; i < g -> vexnum; i++)
cin >> g -> vex[i];
for (int k = 0; k < g -> arcnum; k++){
cout << "请输入第" << k + 1 << "条边的值: " << endl;
cin >> data1 >> data2 >> weight;
int i = location(g, data1);
int j = location(g, data2);
if (i != -1 && j != -1){
g -> arc[i][j] = weight;
g -> arc[j][i] = weight;
}else{
cout << "输入有误,请重新输入";
}
}
return;
}
// 第一个邻接点
int firstAdjNode(Matrix g, int x){
for (int i = 0; i < g.vexnum; i++){
if(g.arc[x][i] != 0){
return i;
}
}
return -1;
}
// 相对于w的下一个邻接点
int nextAdjNode(Matrix g, int x, int w){
for (int i = w + 1; i < g.vexnum; i++){
if (g.arc[x][i] != 0){
return i;
}
}
return -1;
}
int bubble(int * p, int len, int count){
int * arr = p;
for (int i = 1; i < len; i++){
for (int j = 0; i < len - i; i++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr[count];
}
int minSub(int * dist, int len, bool * sure){
int min = 214647;
int sub;
int k;
for (int i = 0; i < len; i++){
if (!sure[i]){
if (min > dist[i]){
min = dist[i];
k = i;
}
}
}
return k;
}
void Dijkstra(Matrix m, int i){
int count = 0;
initDjs(dist, path, sure);
dist[i] = 0; path[i] = -1; sure[i] = true; count++;
for (int j = 0; j < m.vexnum; j++){
if (m.arc[i][j] != 0){
dist[j] = m.arc[i][j];
path[j] = i;
}
}
while (count < m.vexnum){
int k = minSub(dist, m.vexnum, sure);
cout << k << endl;
sure[k] = true; count++;
for (int j = 0; j < m.vexnum; j++){
if (m.arc[k][j] != 0 && !sure[j]){
if (dist[k] + m.arc[k][j] < dist[j]){
dist[j] = m.arc[k][j] + dist[k];
path[j] = k;
}
}
}
}
cout << "dist" << "\t";
for (int i = 0; i < m.vexnum; i++){
cout << dist[i] << "\t";
}
cout << "\n";
cout << "path" << "\t";
for (int i = 0; i < m.vexnum; i++){
cout << path[i] << "\t";
}
cout << "\n";
}
void initGraph(Matrix * m){
// 初始化矩阵
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
m->arc[i][j] = 0;
// 创建矩阵
createMatrix(m);
// 输出图的邻接矩阵
for (int i = 0; i < m->vexnum; i++){
for (int j = 0; j < m->vexnum; j++)
cout << m->arc[i][j] << " ";
cout << endl;
}
}
int main(){
Matrix m;
initGraph(&m);
Dijkstra(m, 0);
return 0;
}
单源有权图的最短路径,迪杰斯特拉算法实现
最新推荐文章于 2024-09-14 22:25:23 发布