/*
--------------------------------------
VER : 1.0
DATE : 2017/11/29
AUET : WUD
--------------------------------------
*/
#include <iostream>
using namespace std;
const int MAX=20;
const int INF=9999;
typedef bool PathMatrix[MAX+1][MAX+1];
typedef int ShortPathTable[MAX+1];
typedef struct{
int vexnum,arcnum;
char vexs[MAX+1];
int arcs[MAX+1][MAX+1];
}MGraph;
void Create_MG(MGraph &G){
int i,j,v1,v2,w;//v1,v2,w 输入一对顶点并置对应边权值
cout<<"请输入顶点和边的个数:"<<endl;
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INF;
for(i=0;i<G.vexnum;i++){
cout<<"请输入第"<<i<<"个顶点:"<<endl;
cin>>G.vexs[i];
}
for(i=1;i<=G.arcnum;i++){
cout<<"请输入边--格式: 源点 终点 权值 "<<endl;
cout<<"如 0 2 10"<<endl;
cin>>v1>>v2>>w;
G.arcs[v1][v2]=w;
}
}
void ShortestPath_DIJ(MGraph &G,int v0,PathMatrix &P,ShortPathTable &D){
//求有向图v0到其他顶点的最短路径P,以及带权长度D
//其中P是二维数组,行号为终点,列号表示经过的路径(P[W][v]为True表示从v0到
//w要经过v,D是一维数组,表示从v0到某顶点的路径长((D[v] == 10表示
//从v0到v要经过的路径长度为10) final存放已经求得的路径结果
//(比如final]v]为TRUE表示已经找到v0到v的最短路径)
bool final[MAX];
int v,w,j;
for( v=0;v<G.vexnum;v++){
final[v]=false;
D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++){
P[v][w]=false;//设空路径
}
if(D[v]<INF){
P[v][v0]=true;
P[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;//初始化,V0属于S集
//开始主循环,依次将其他n-1个顶点加入S集
for(v=1;v<G.vexnum;v++){
int min=INF;
for(w=0;w<G.vexnum;w++){
if(!final[w] && D[w]<min){
//w在V-S中,且离v0顶点更近
min=D[w];
v=w;
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++){
//更新当前最短路径及距离
if(!final[w] && (min+G.arcs[v][w]<D[w])){
//修改D[w]及P[w] 其中w在V-S中
D[w]=min+G.arcs[v][w];
for(j=0;j<G.vexnum;j++)
P[w][j]=P[v][j];
P[w][w]=true;
}
}
}
}
int main()
{
MGraph G;
Create_MG(G);
PathMatrix P;
ShortPathTable D;
ShortestPath_DIJ(G,0,P,D);
for(int i=0;i<G.vexnum;i++)
{
cout<<"V0到"<< i <<"的最短路径是:"<<endl;
for(int j=0;j<G.vexnum;j++)
{
cout<<P[i][j];
}
cout<<"路径长度为"<<D[i]<<endl;
}
}
迪杰斯特拉算法(Dijkstra)
最新推荐文章于 2024-08-04 08:21:42 发布