解决BFS算法只能求解无向图的最短路径的缺点。求有向带权图中某点到其他各点的最短距离和要经过的点
## 代码实现:
#include<iostream>
#include<malloc.h>
#define MaxVertexNum 100
#define INFINITY 10000
using namespace std;
typedef struct{
int vertex[MaxVertexNum];
int Edge[MaxVertexNum][MaxVertexNum];
int vertexNum,EdgeNum;
}MGraph;
//邻接矩阵法创建一个有向带权图
void CreateMGraph(MGraph *G)
{
int i,j,k,w;
printf("请输入图的顶点数和边数:");
cin>>G->vertexNum>>G->EdgeNum;
printf("请输入图的各个顶点的信息(A,B…):");
for(i=0;i<G->vertexNum;i++)
cin>>G->vertex[i];
for(i=0;i<G->vertexNum;i++)
{
for(j=0;j<G->vertexNum;j++)
G->Edge[i][j]=INFINITY;
}
printf("请输入各条边的信息(例:1 2表示在A顶点和B顶点之间有一条边):\n");
for(k=0;k<G->EdgeNum;k++)
{//此为创建有向图的邻接矩阵
int Iindex,Jindex,weight;
cin>>Iindex>>Jindex>>weight;
G->Edge[Iindex][Jindex]=weight;
}
}
void DisplayMGraph(MGraph G)
{
int i,j;
printf(" ");
for(i=0;i<G.vertexNum;i++)
printf("%d\t",G.vertex[i]);
for(i=0;i<G.vertexNum;i++)
{
printf("\n%d\t",G.vertex[i]);
for(j=0;j<G.vertexNum;j++)
printf("%d\t",G.Edge[i][j]);
}
}
void shortestPathDijkstra(MGraph G,int u)
{
int i;
bool final[G.vertexNum]={false};//标记各顶点是否已找到最短路径
int distance[G.vertexNum];//存储u点到各点的最短路径长度
int parentPath[G.vertexNum];//parentPath[i]存放i点的前驱结点
for(i=0;i<G.vertexNum;i++)//G.vertexNum-1次搜索
{
distance[i]=G.Edge[u][i];//初始化distance数组,u点可直达的,为具体数值,
//不可直达的为INFINITY
if(G.Edge[u][i]!=INFINITY)//初始化parentPath数组,u可达的点赋值为u,
//不可达的点赋值为-1
parentPath[i]=u;
else
parentPath[i]=-1;
}
final[u]=true;//初始化,u结点已经找到最短路径
distance[u]=0;
//以上均为初始化阶段
for(i=0;i<G.vertexNum-1;i++)
{
int j,min=distance[1],minindex=1;
for(j=1;j<G.vertexNum&&final[j]==false;j++)//找到未确定路径最短的点
{
if(distance[j]<min)
{
min=distance[j];
minindex=j;
}
}
final[minindex]=true;//令最短路径点被确认
//检查所有邻接minindex的顶点,若其final值为false,则更新distance数组
//和parentPath数组信息
for(j=1;j<G.vertexNum;j++)
{
if(distance[minindex]+G.Edge[minindex][j]<distance[j])
{
distance[j]=distance[minindex]+G.Edge[minindex][j];
parentPath[j]=minindex;
}
}
}
printf("\n\n%d顶点到各点的最短距离为:\n",u);
printf("顶点\t 最短距离\n");
for(i=0;i<G.vertexNum;i++)
{
printf(" %d\t\t%d\n",i,distance[i]);
}
printf("\n%d顶点到各顶点的最短路径为:\n");
printf("顶点\t最短路径\n");
for(i=0;i<G.vertexNum;i++)
{
int temp=parentPath[i];
printf("%d\t%d",i,i);
while(temp!=-1)
{
printf("<-%d",temp);
temp=parentPath[temp];
}
printf("\n");
}
}
int main()
{
MGraph G;
CreateMGraph(&G);
DisplayMGraph(G);
shortestPathDijkstra(G,0);
return 0;
}
测试数据:
5 10
0 1 2 3 4
1 2 1
1 4 2
4 1 3
2 3 4
0 4 5
3 2 6
3 0 7
4 3 2
4 2 9
0 1 10