#ifndef DIIKSTRA_H_INCLUDED
#define DIIKSTRA_H_INCLUDED
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100/* 最大顶点数,应由用户定义 */
#define INFINITY 65535 /* 表示权值的无穷*/
using namespace std;
typedef int EdgeType;
typedef char VertexType;
typedef int ElemType;
//c++邻接矩阵实现
typedef struct
{
VertexType vexs[MAXVEX];/* 顶点表 */
EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
int numNodes, numEdges;/* 图中当前的顶点数和边数 */
} MGraph;
/* 建立无向网图的邻接矩阵表示 */
void CreateMGraph(MGraph *Gp)
{
int i, j, k, w;
cout << "请输入顶点数和边数(空格分隔):" << endl;
cin >> Gp->numNodes >> Gp->numEdges;
cout << "请输入顶点信息(空格分隔):" << endl;
for (i = 0; i < Gp->numNodes; i++)
cin >> Gp->vexs[i];
for (i = 0; i < Gp->numNodes; i++)
{
for (j = 0; j < Gp->numNodes; j++)
{
if (i == j)
Gp->arc[i][j] = 0;/* 顶点没有到自己的边*/
else
Gp->arc[i][j] = INFINITY;/* 邻接矩阵初始化 */
}
}
for (k = 0; k < Gp->numEdges; k++)
{
cout << "请输入边(vi, vj)的上标i,下标j和权值w(空格分隔):" << endl;
cin >> i >> j >> w;
Gp->arc[i][j] = w;
Gp->arc[j][i] = Gp->arc[i][j];/* 因为是无向图,矩阵对称 */
}
}
#endif // DIIKSTRA_H_INCLUDED
#include "DIIkstra.h"
#include <iostream>
using namespace std;
void Dijkstra(int s,int k,MGraph *G);
int main()
{
MGraph M;
CreateMGraph(&M);
int m,n;
cout<<"请输入所求最短路径的两个顶点:"<<endl;
cin>>m>>n;
Dijkstra(m,n,&M);
return 0;
}
void Dijkstra(int s,int k,MGraph *G)
{
int path[G->numNodes];//记录顶点的前驱
int dist[G->numNodes];//记录顶点到源点s的距离
for(int i=0;i<G->numNodes;i++)
{
dist[i]=G->arc[s][i];
}//初始化顶点到源点的距离
for(int i=0;i<G->numNodes;i++)
{
if(dist[i]==INFINITY)
path[i]=-1;
else
path[i]=s;
}//初始化顶点的前驱
bool collected[G->numNodes];//判断该顶点是否存在于最短路径顶点集中
for(int i=0;i<G->numNodes;i++)
{
collected[i]=false;
}
int tmp;
int j;
while(true)
{
tmp=INT_MAX;
j=-1;
for(int i=0;i<G->numNodes;i++)
{
if(dist[i]<tmp&&collected[i]==false)
{
tmp=dist[i];
j=i;
}
}//遍历后j为未收录顶点dist最小者
if(j==-1)
break;
collected[j]=true;
for(int i=0;i<G->numNodes;i++)
{
if(G->arc[j][i]!=INFINITY&&G->arc[j][i]!=0)
{
if(collected[i]==false)
{
if(G->arc[j][i]+dist[j]<dist[i])
{
dist[i]=G->arc[j][i]+dist[j];//更新顶点到s的距离
path[i]=j;//更新顶点的前驱
}
}
}
}
}
cout<<"该最短路径所经过的顶点为:"<<endl;
cout<<k<<" ";
while(path[k]!=0)
{
cout<<path[k]<<" ";
k=path[k];
}
cout<<s;
}