| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1462 人关注过本帖
标题:[求助]最短路径问题
只看楼主 加入收藏
d454268523
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-6-4
收藏
 问题点数:0 回复次数:3 
[求助]最短路径问题

最近做了个课程设计“校园导游咨询”中求最短路径的部分出了错误!
我找了几天都没找到错误,故向大家求助!
请大家帮我看看红色部分的算法有什么错误!或者其他地方的错误!谢谢了!!(其中包含的文件我也传了,在附件里)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"

#define OK 1
#define FLASE 0
#define TRUE 1
#define ERROR

#define MAXVTXNUM 20 /*图中顶点的最大值*/
#define INFINITY 999


/*顶点,边和图的类型定义*/
typedef struct{
char name[20]; /*该顶点代表的景点的名称*/
char info[50]; /*景点的信息*/
}VertexType; /*顶点类型*/


typedef struct{
int length; /*边的权值,表示路径长度*/
int ivex,jvex; /*边的两端顶点的位置*/
}EdgeType; /*边的类型*/


typedef struct EdgeNode{
EdgeType elem;
struct EdgeNode *ilink,*jlink;
}EdgeNode,*EdgePtr; /*边的结点类型,指向边的指针*/


typedef struct{
VertexType data;
EdgePtr firstEdge; /*指向第一条依附该顶点的边的指针*/
}VNode; /*顶点类型*/


typedef struct{
VNode Adjmulist[MAXVTXNUM]; /*邻接多重表*/
int vexNum,edgeNum; /*图中的顶点数和边数*/
}GraphType; /*图类型*/


/*图的基本操作*/
void InitGraph(GraphType *g); /*初始化邻接多重表,表示一个空图*/
void GetVex(GraphType *g,int i,VertexType *v); /*以v返回邻接多重表中序号为i的顶点*/
EdgePtr FirstEdge(GraphType *g,int vi); /*返回图g中指向依附于顶点vi的第一条边的指针*/
void NextEdge(GraphType *g,int vi,EdgePtr p,int *vj,EdgePtr q); /*以vj返回图g中依附于顶点vi的一条边的另一端点,以q返回图中依附于顶点vi且相对于指针p所指的边的下一条边*/
void InsertVex(GraphType *g,VertexType v,int i); /*在图g的邻接多重表中添加一个顶点v*/
void InsertEdge(GraphType *g,EdgeType e); /*在图g的邻接多重表中添加一条边e*/

void InitGraph(GraphType *g) /*初始化邻接多重表,表示一个空图*/
{
g->vexNum=g->edgeNum=0;
}


void GetVex(GraphType *g,int i,VertexType *v) /*以v返回邻接多重表中序号为i的顶点*/
{
*v=g->Adjmulist[i].data;
}

EdgePtr FirstEdge(GraphType *g,int vi) /*返回图g中指向依附于顶点vi的第一条边的指针*/
{
EdgePtr p;
p=g->Adjmulist[vi].firstEdge;
return p;
}

void NextEdge(GraphType *g,int vi,EdgePtr p,int *vj,EdgePtr q) /*以vj返回图g中依附于顶点vi的一条边的另一端点,以q返回图中依附于顶点vi且相对于指针p所指的边的下一条边*/
{
if(p->elem.ivex==vi)
{
q=p->ilink;
*vj=p->elem.jvex;
}
else
{
q=p->jlink;
*vj=p->elem.ivex;
}
}

void InsertVex(GraphType *g,VertexType v,int i) /*在图g的邻接多重表中添加一个顶点v*/
{
g->Adjmulist[i].data=v;
g->Adjmulist[i].firstEdge=NULL;
}

void InsertEdge(GraphType *g,EdgeType e) /*在图g的邻接多重表中添加一条边e*/
{
EdgePtr p;
p= (EdgePtr) malloc(sizeof(EdgeNode));
p->elem=e;
p->ilink=FirstEdge(g,e.ivex);
p->jlink=FirstEdge(g,e.jvex);
g->Adjmulist[e.ivex].firstEdge=g->Adjmulist[e.jvex].firstEdge=p;
}

/*路径的类型定义*/
typedef struct{
int vx,vy;
}Edge;


typedef struct{
Edge edges[MAXVTXNUM]; /*路径中边的序列*/
int len; /*路径中边的条数*/
}PathType;


typedef struct{
char vertices[MAXVTXNUM][MAXVTXNUM]; /*路径中景点的序列*/
int num;
}PType;

/*路径的相关基本操作*/
void InitPath(PathType *pa); /*初始化pa为一条空路径*/
void CopyPath(PathType *p1,PathType p2); /*复制路径p1=p2*/
void InsertPath(PathType *pa,int v,int w); /*在路径pa中插入一条边(v.w)*/
int PathLength(PathType *pa); /*返回路径pa的长度*/
void OutPath(GraphType *g,PathType pa,PType *vtxes); /*将路径转换为景点名称的序列*/
void ShortestPath(GraphType *g,int st,int nd,int *pathLength,PType *PathInfo); /*求图g中从顶点st到顶点nd的一条最短路径PathInfo及其长度pathLength*/
void PrintScenery(int x,GraphType *g);
void PrintPath(PType *spath,int *pathlen);


void InitPath(PathType *pa) /*初始化pa为一条空路径*/
{
pa->len=0;
}


void CopyPath(PathType *p1,PathType p2) /*复制路径p1=p2*/
{
int i;
for(i=0;i<p2.len;i++)
{
p1->edges[i].vx=p2.edges[i].vx;
p1->edges[i].vy=p2.edges[i].vy;
}
p1->len=p2.len;
}

void InsertPath(PathType *pa,int v,int w) /*在路径pa中插入一条边(v.w)*/
{
pa->edges[pa->len].vx=v;
pa->edges[pa->len].vy=w;
pa->len++;
}


int PathLength(PathType *pa) /*返回路径pa的长度*/
{
return pa->len;
}

void OutPath(GraphType *g,PathType pa,PType *vtxes) /*将路径转换为景点名称的序列*/
{
int i,m=0;
VertexType vtx;
for(i=0;i<pa.len;i++)
{
GetVex(g,pa.edges[i].vx,&vtx);
strcpy(vtxes->vertices[m++],vtx.name);
}
GetVex(g,pa.edges[pa.len].vy,&vtx);
strcpy(vtxes->vertices[m],vtx.name);
vtxes->num=m;
}



int InsetVex(int Vex[],int num,int w)
{
int i;
for(i=0;i<num;i++)
if(Vex[i]==w)
return TRUE;
return FLASE;
}


int minval(int dist[],int num,int Vex[])
{
int i,k;
int min=dist[0];
for(i=1;i<MAXVTXNUM;i++)
if(dist[i]<min&&!InsetVex(Vex,num,i))
{
min=dist[i];
k=i;
}
return k;
}

void ShortestPath(GraphType *g,int st,int nd,int *pathLength,PType *PathInfo) /*求图g中从顶点st到顶点nd的一条最短路径PathInfo及其长度pathLength*/
{
int dist[MAXVTXNUM];
PathType Path[MAXVTXNUM];
int i,found,min,v,w,k;
int count=0;
EdgePtr p,q;
int adjvex;
int Vex[MAXVTXNUM];
for(i=0;i<g->vexNum;i++)
{
dist[i]=INFINITY;
InitPath(&Path[i]);
}
p=FirstEdge(g,st);
while(p)
{
NextEdge(g,st,p,&adjvex,q);
dist[adjvex]=p->elem.length;
InsertPath(&Path[adjvex],st,adjvex);
p=q;
}
found=FLASE;
for(i=0;i<MAXVTXNUM;i++)
{
Vex[i]=0;
}
Vex[count++]=st;
while(!found)
{
min=minval(dist,count,Vex);
if(min==nd) found=TRUE;
else
{
v=min;
Vex[count++]=v;
p=FirstEdge(g,v);
while(p)
{
NextEdge(g,v,p,&w,q);
k=InsetVex(Vex,count,w);
if(!k&&((dist[v]+p->elem.length)<dist[w]))
{
dist[w]=dist[v]+p->elem.length;
CopyPath(&Path[w],Path[v]);
InsertPath(&Path[w],v,w);
}
p=q;
}
}
}
*pathLength=dist[nd];
OutPath(g,Path[nd],PathInfo);
}

void GreatGraph(GraphType *g,FILE *f)
{
int i,j;
VertexType v;
EdgeType e;
InitGraph(g);
fscanf(f,"%d%d",&g->vexNum,&g->edgeNum);
for(i=1;i<=g->vexNum;i++)
{
fscanf(f,"%s%s",v.name,v.info);
InsertVex(g,v,i);
}
for(j=0;j<g->edgeNum;j++)
{
fscanf(f,"%d%d%d",&e.ivex,&e.jvex,&e.length);
if(e.length) InsertEdge(g,e);
}
}


void Initialization(GraphType *g)
{
FILE *fp;
if((fp=fopen("d:\\school.txt","r"))==NULL)
{
printf("打开文件出错");
exit(0);

}
GreatGraph(g,fp);
fclose(fp);
}

void ReadCommand(char *cmd)
{
do
{
fflush(stdin);
printf("请选择您所需要的服务:");
scanf("%c",cmd);
}
while(*cmd!='S'&&*cmd!='s'&&*cmd!='V'&&*cmd!='v'&&*cmd!='Q'&&*cmd!='q');
}


void Interpret(char cmd,GraphType *ga)
{ int s,t;
int pathlen;
PType spath;
switch(cmd)
{
case 'S': printf("请输入您要查询的景点编号:");
scanf("%d",&s);
if(s>0&&s<11)
PrintScenery(s,ga);
else
printf("您所查找的景点不存在\n");
break;
case 's': printf("请输入您要查询的景点编号:");
scanf("%d",&s);
if(s>0&&s<11)
PrintScenery(s,ga);
else
printf("您所查找的景点不存在\n");
break;
case 'V': printf("请输入始点:");
scanf("%d",&s);
printf("请输入终点:");
scanf("%d",&t);
ShortestPath(ga,s,t,&pathlen,&spath);
PrintPath(&spath,&pathlen);
break;
case 'v': printf("请输入始点:");
scanf("%d",&s);
printf("请输入终点:");
scanf("%d",&t);
ShortestPath(ga,s,t,&pathlen,&spath);
PrintPath(&spath,&pathlen);
break;
case 'Q': break;
case 'q': break;
}
}


main()
{
char cmd;
GraphType ga;
Initialization(&ga);
do
{
printf(" 欢迎使用青岛理工大学校园导游系统\n");
printf("1. 正门\n");
printf("2. 科学会堂\n");
printf("3. 图书馆\n");
printf("4. 校医院\n");
printf("5. 实验楼\n");
printf("6. 1号教学楼\n");
printf("7. 2号教学楼\n");
printf("8. 3号教学楼\n");
printf("9. 大学生活动中心\n");
printf("10. 体育馆\n\n");
printf("S.查询景点信息\n");
printf("V.寻找最短路径\n");
printf("Q.退出系统\n");
ReadCommand(&cmd);
Interpret(cmd,&ga);
}while(cmd!='q'&&cmd!='Q');
}

void PrintScenery(int x,GraphType *g)
{
printf("您所查询的景点信息为:");
printf("%s----",g->Adjmulist[x].data.name);
printf("%s\n",g->Adjmulist[x].data.info);
}

void PrintPath(PType *spath,int *pathlen)
{
int i;
for(i=0;i<spath->num;i++)
printf("%s--",spath->vertices[i]);
printf("\n路径的长度为:%d\n",*pathlen);
}

YTDWZgXt.txt (478 Bytes) [求助]最短路径问题


搜索更多相关主题的帖子: 路径 
2007-07-02 11:32
d454268523
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-6-4
收藏
得分:0 
没有人看到吗??
帮帮我啊!
2007-07-04 17:41
pxs623
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-10-13
收藏
得分:0 
我要做这个了^^^^^
2008-12-01 16:55
快速回复:[求助]最短路径问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019720 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved