最短路径(迪杰斯特拉算法)

源代码:
#include<stdio.h>
#define MaxInt 32767 //表示极大值
#define MVNum 100 //最大顶点数
typedef char VerTexType; //定义数据类型
typedef int ArcType;
typedef struct
{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum];//邻接矩阵
int vexnum,arcnum; //图的点数和边数
}AMGraph;
int LocateVex(AMGraph G,char v)//确定V在G中的位置
{
int i;
for(i = 0; i < G.vexnum; i++)
{
if(G.vexs[i] == v) //如果找到,返回其序号
break;
}
return i;
}
int CreateUDN(AMGraph &G)
{
int v1,v2,w,i,j;
printf(“请输入总顶点数和总边数:”);
scanf("%d %d",&G.vexnum,&G.arcnum);
printf(“请输入点的信息:\n”);
for(i = 0; i < G.vexnum; i++)
scanf(" %c",&G.vexs[i]);
for(i = 0;i < G.vexnum;i++) //初始化邻接矩阵
for(j = 0; j < G.vexnum; j++)
G.arcs[i][j]= MaxInt;
for(int k = 0; k < G.arcnum; k++)//构造邻接矩阵
{
printf(“请输入一条边(第%d条边)连接的两个顶点以及权值:”,k+1);
scanf(" %c %c %d",&v1,&v2,&w);//输入一条边依附的顶点及权值
i = LocateVex(G,v1);
j = LocateVex(G,v2);
G.arcs[i][j] = w; //设置权值
G.arcs[j][i] = MaxInt;
}
return 0;
}
void ShortestPath_DIJ(AMGraph G, char v0)
{
int i,v,w,min,k;
bool S[MVNum]; //记录路径
int D[MVNum]; //保存最短路径长度
int p[MVNum][MVNum]; //路径
k = LocateVex(G,v0); //源点下标
for(v = 0; v < G.vexnum; v++) //初始化
{
S[v] = false; //初始为空集
D[v] = G.arcs[k][v];
for(w = 0; w < G.vexnum; w++)
p[v][w] = 0; //设空路径
if(D[v] < MaxInt)
{
p[v][k] = 1;
p[v][v] = 1;
}
}
S[k] = true; //v0加入S
D[k] = 0; //源点到源点距离为0
printf(“最短路径为\n”);
for(i = 1; i < G.vexnum; i++)
{ //主循环,每次求得v0到某个顶点v的最短路径 并加v到集合S中
min = MaxInt;
for(w = 0; w < G.vexnum; w++)
if(!S[w] && D[w] < min)
{
v = w;
min = D[w]; //选择一条当前最短路径,终点为v
}
S[v] = true; //v加入S
for(w = 0; w < G.vexnum; w++) //更新当前最短路径和距离
if(!S[w] && (min + G.arcs[v][w] < D[w]))
{
D[w] = min + G.arcs[v][w]; //更新D[w]
p[w][w] = 1;
}
printf(“D[%d] = %d\n”, i, D[i]);
}

}
int main()
{
char v0;
AMGraph G;
CreateUDN(G);
printf(“请输入源点:\n”);
scanf(" %c",&v0);
ShortestPath_DIJ(G, v0);
return 0;
}
运行例图:在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值