迪杰斯特拉最短路径算法问题

zhangpeng12340302 2011-05-22 11:16:58
下面是我参考严蔚敏老师《数据结构C语言版》中的迪杰斯特拉最短路径算法编的程序,运行结果不正确,不知道程序哪里出错了,求改正!下面我贴出来


#include "stdio.h"
#include "stdlib.h"
#define MAX 20
#define INFINITY 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 CreateDN(MGraph &G)
{
int i,j,k,v1,v2,w;
printf("请输入顶点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("请输入第%d个结点:",i);
scanf("%c",&G.vexs[i]);
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;
for(k=0;k<G.arcnum;k++)
{
printf("请输入边----源点,终点,权值:");
scanf("%d %d %d",&v1,&v2,&w);
G.arcs[v1][v2]=w;
}
}

void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &p,ShortPathTable &D)
{
int v,w,i,min;
bool final[MAX+1];
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]<INFINITY)
{
p[v][v0]=true;
p[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;
for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if (!final[w])
{
if (D[w]<min)
{
v=w;
min=D[w];
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
if (!final[w]&&(min+G.arcs[v][w]<D[w]))
{
D[w]=min+G.arcs[v][w];
for(i=0;i<G.vexnum;i++)
p[w][i]=p[v][i];
p[w][w]=true;
}
}
}

void main()
{
MGraph G;
int i,j;
CreateDN(G);
PathMatrix p;
ShortPathTable D;
ShortestPath_DIJ(G,0,p,D);
for(i=0;i<G.vexnum;i++)
{
printf("0到顶点%d的最短路径为:\n",i);
for(j=0;j<G.vexnum;j++)
printf("%d ",p[i][j]);
printf("代价为:%d\n",D[i]);
printf("\n");
}

}

运行结果如下:
请输入顶点数和边数:6 8
请输入第0个结点:a
请输入第1个结点:b
请输入第2个结点:c
请输入第3个结点:d
请输入第4个结点:e
请输入第5个结点:f
请输入边----源点,终点,权值:0 2 10
请输入边----源点,终点,权值:0 5 100
请输入边----源点,终点,权值:0 4 30
请输入边----源点,终点,权值:1 2 5
请输入边----源点,终点,权值:2 3 50
请输入边----源点,终点,权值:4 5 60
请输入边----源点,终点,权值:3 5 10
请输入边----源点,终点,权值:4 3 20
0到顶点0的最短路径为:
0 0 0 0 0 0 代价为:0

0到顶点1的最短路径为:
0 0 0 0 0 0 代价为:9999

0到顶点2的最短路径为:
1 0 1 0 0 0 代价为:10

0到顶点3的最短路径为:
1 0 1 1 0 0 代价为:60

0到顶点4的最短路径为:
1 0 0 0 1 0 代价为:30

0到顶点5的最短路径为:
1 0 0 0 0 1 代价为:100

Press any key to continue

这个结果不正确,因为书上正确结果应该是如下
始点 终点 最短路径 路径长度
v0 v1 无
v2 (v0,v2) 10
v3 (v0,v4,v3) 50
v4 (v0,v4) 30
v5 (v0,v4,v3,v5)60

所以对比知道程序中到v3,v5的路径和长度都求错了
所以请高手指出哪里错了,程序是照着课本上的算法原版改的,难道是算法错了?
请高手指教!
...全文
512 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ct1248311827 2012-07-15
  • 打赏
  • 举报
回复
v0 v1 无
v2 (v0,v2) 10
v3 (v0,v4,v3) 50
v4 (v0,v4) 30
v5 (v0,v4,v3,v5)60

如何把这个结果跟程序运行结果对应起来看啊???
zhangpeng12340302 2011-05-23
  • 打赏
  • 举报
回复
现贴出来完整正确代码和输入输出:

#include "stdio.h"
#include "stdlib.h"
#define MAX 20
#define INFINITY 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 CreateDN(MGraph &G)
{
int i,j,k,v1,v2,w;
printf("请输入顶点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("请输入第%d个结点:",i);
scanf("%c",&G.vexs[i]);
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;
for(k=0;k<G.arcnum;k++)
{
printf("请输入边----源点,终点,权值:");
scanf("%d %d %d",&v1,&v2,&w);
G.arcs[v1][v2]=w;
}
}

void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &p,ShortPathTable &D)
{
int v,w,i,min,j;
bool final[MAX+1];
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]<INFINITY)
{
p[v][v0]=true;
p[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;
for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if (!final[w])
{
if (D[w]<min)
{
v=w;
min=D[w];
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
if (!final[w]&&(min+G.arcs[v][w]<D[w]))
{
D[w]=min+G.arcs[v][w];
for(j=0;j<G.vexnum;j++)
p[w][j]=p[v][j];
p[w][w]=true;
}
}
}

void main()
{
MGraph G;
int i,j;
CreateDN(G);
PathMatrix p;
ShortPathTable D;
ShortestPath_DIJ(G,0,p,D);
for(i=0;i<G.vexnum;i++)
{
printf("0到顶点%d的最短路径为:\n",i);
for(j=0;j<G.vexnum;j++)
printf("%d ",p[i][j]);
printf("代价为:%d\n",D[i]);
printf("\n");
}

}


输入输出如下:
请输入顶点数和边数:6 8
请输入第0个结点:a
请输入第1个结点:b
请输入第2个结点:c
请输入第3个结点:d
请输入第4个结点:e
请输入第5个结点:f
请输入边----源点,终点,权值:0 2 10
请输入边----源点,终点,权值:0 5 100
请输入边----源点,终点,权值:0 4 30
请输入边----源点,终点,权值:1 2 5
请输入边----源点,终点,权值:2 3 50
请输入边----源点,终点,权值:4 5 60
请输入边----源点,终点,权值:3 5 10
请输入边----源点,终点,权值:4 3 20
0到顶点0的最短路径为:
0 0 0 0 0 0 代价为:0

0到顶点1的最短路径为:
0 0 0 0 0 0 代价为:9999

0到顶点2的最短路径为:
1 0 1 0 0 0 代价为:10

0到顶点3的最短路径为:
1 0 0 1 1 0 代价为:50

0到顶点4的最短路径为:
1 0 0 0 1 0 代价为:30

0到顶点5的最短路径为:
1 0 0 1 1 1 代价为:60

Press any key to continue
zhangpeng12340302 2011-05-23
  • 打赏
  • 举报
回复
我找到错误了,是编程不小心导致的,现贴在下面:


for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if (!final[w])
{
if (D[w]<min)
{
v=w;
min=D[w];
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
if (!final[w]&&(min+G.arcs[v][w]<D[w]))
{
D[w]=min+G.arcs[v][w];
for(j=0;j<G.vexnum;j++)//原本写成了i,跟第一个外循环重了
p[w][j]=p[v][j];
p[w][w]=true;
}
}

zhangpeng12340302 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 super_admi 的回复:]
咦?这个名字音译过来原来是这样的啊?我一直都不知道……
[/Quote]

呵呵,严的数据结构就是这样音译的啊!
super_admi 2011-05-22
  • 打赏
  • 举报
回复
咦?这个名字音译过来原来是这样的啊?我一直都不知道……

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧