迪杰斯特拉算法c语言6,迪杰斯特拉算法C语言实现

#ifndef GUIDE_H_INCLUDED

#define GUIDE_H_INCLUDED

#define MX 1000 //最大值 无穷

#define NUM 6 //最大顶点个数

typedef int adjmatrix[NUM][NUM];

typedef int path[NUM][NUM];

typedef int Dist[NUM];//v0到vi的的距离

int ps[NUM]={0}; //最短路径值

int final[NUM];//final[i]=1代表已经求出v0到vi的最短路径

const int vexs[NUM] = {0,1,2,3,4,5};

int arcs[NUM][NUM] = {

{MX,MX,10,MX,30,100},

{MX,MX,5,MX,MX,MX},

{MX,MX,MX,50,MX,MX},

{MX,MX,MX,MX,MX,10},

{MX,MX,MX,20,MX,60},

{MX,MX,MX,MX,MX,MX}

};

#endif

#include

using namespace std;

#include "guide.h"

//=====================================================

void ShorttestPath_DIJ(adjmatrix arc,int v,path &p,Dist &d)

{

//用迪杰斯特拉算法求解v0到其余个点的最短路径,p[v][w]代表v0到v经过w

int w=0;

for(int nv=0;nv

{

final[nv]=0;

d[nv]=arc[v][nv];

ps[nv]=d[nv];

for(int w=0;w

if(d[nv]

{

p[nv][v]=1;

p[nv][nv]=1;

}

}//for

d[v]=0;

final[v]=1;

int min=MX;

//开始主循环

for(int i=1;i

{

min=MX;

for(w=0;w

{

if(final[w]==0)

{

if(d[w]

{

v=w;

min=d[w];

}

}

}//for

final[v]=1;

for(w=0;w

{

if(final[w]==0&&(min+arc[v][w])

{

d[w]=min+arc[v][w];

ps[w]=ps[v]+arc[v][w];

for(int pos=0;pos

{

p[w][pos]=p[v][pos];//借助最短路径到达w点

}

p[w][w]=1;//经过w点

}//endif

}//for

}//for

}

void DIJ_Print(int start,path &P)

{

for(int i=1;i

{

int u=i;

if(final[i]==1)

{

cout<

cout<

int m=start;

for(int j=1;j

{

if( P[u][j]==1)

{

if(arcs[m][j]>0 && arcs[m][j]

{

cout<"<

m=j;

j=1;

}

}

}

cout<

}//endif

}//endfor

}

void ShortestPath()

{

int start = 5;

Dist D; //D[i]表示从start到i的最短距离;

path P; //P[i,j]表示从start到i的最短路径上会经过j

int t[NUM]={0};

int n=0;

cout << "输入出发点 (0~5 空格分隔)" << endl;

cin >> start;

if(start>=0 && start<6)

{

//调用迪杰斯特拉算法

ShorttestPath_DIJ(arcs,start,P,D);

cout <

cout << "到其他各点的最短路径长度 :"<

//调用迪杰斯特拉打印算法

DIJ_Print(start,P);

}//endif

else

cout << "没有这个地方!" << endl;

}

//============== mian文件 =============

int main()

{

char choose=0;

cout << "************************" << endl;

cout << " a.x到其他点的最短路径 " << endl;

cout << " b.退出 " << endl;

cout << " 版本号v1.8 " << endl;

cout << "************************" << endl;

cin >> choose;

while( choose!='b' )

{

if( choose=='a' )

{

ShortestPath();

cout << "===========================" << endl;

cout << " a.x到y的最短路径 b.退出 " << endl;

cout << "===========================" << endl;

}

else if(choose!='a'||choose!='b') cout << "输入错误,请重新输入:";

cin >> choose;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值