C语言求图的最短距离

CloudStrifers 2012-10-19 11:23:00
题目描述:求最短路径。用链接表方法定义一个有向图作为输入,计算两个点之间的最短距离。输入描述:顶点数目:4
邻接表:顶点,(邻接点...),(权...)
1-(2,3,4),(10,8,7);
2-(3,4),(13,2);
3-(4),(10);
4-(1),(8);
以及起点和终点:
1,4
输出描述:1到4的最短距离。
输入样例:4
1-(2,3,4),(10,8,7); 2-(3,4),(13,2); 3-(4),(10); 4-(1),(8);
1,4
输出样例:7
...全文
447 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-09-10
  • 打赏
  • 举报
回复
看看 C语言版 数据结构!
modyaj 2013-09-10
  • 打赏
  • 举报
回复
同学 数据结构的课本上就都会有介绍的吧
清天灵月 2012-10-19
  • 打赏
  • 举报
回复
这是我上 数据结构的 关于图的一个实验 ,学校的各个机构为点,计算最短路径,希望对你有帮助!
<pre class="cpp" name="code">
#include<stdio.h>
#define MaxVerterNum 100
#define Number 10
typedef int Vertextype;
typedef int EdgeType;
typedef struct
{
Vertextype vexs[MaxVerterNum];
EdgeType edges[MaxVerterNum][MaxVerterNum];
}MGragh;

/*菜单函数*/
void menu()
{
printf("\Welcome to the navigation system!\n");
printf("*********************************\n");
printf("* N1--The north gate *\n");
printf("* N2--Building signs *\n");
printf("* N3--Administrative buildings *\n");
printf("* N4--North teaching buildings *\n");
printf("* N5--Area C buildings *\n");
printf("* N6--North neihu *\n");
printf("* N7--Track *\n");
printf("* N8--North canteen *\n");
printf("* N9--Library *\n");
printf("* N10--The big library *\n");
printf("*********************************\n");
printf("\n[menu]\n");
printf("You can:\n");
printf("1---Introduce\n");
printf("2---Path\n");
printf("0---Exit\n");
}

/*建立图函数*/
void creat(MGragh *G)
{
int i,j;
for(i=1;i<=Number;i++) G->vexs[i]=i;/*初始化,0号位不用*/
for(i=1;i<=Number;i++)
for(j=1;j<=Number;j++) G->edges[i][j]=0;/*初始值为0。*/
G->edges[1][2]=3;G->edges[2][1]=3;
G->edges[2][3]=1;G->edges[3][2]=1;
G->edges[2][4]=1;G->edges[4][2]=1;
G->edges[2][5]=3;G->edges[5][2]=3;
G->edges[5][6]=2;G->edges[6][5]=2;
G->edges[6][7]=2;G->edges[7][6]=2;
G->edges[7][9]=2;G->edges[9][7]=2;
G->edges[8][9]=3;G->edges[9][8]=3;
G->edges[4][8]=1;G->edges[8][4]=1;
G->edges[2][10]=1;G->edges[10][2]=1;
for(i=1;i<=Number;i++)
for(j=1;j<=Number;j++)
if(G->edges[i][j]==0)
G->edges[i][j]=MaxVerterNum;
/*没有被重新赋值的,表示两景点之间没有路,用MaxVerterNum表示无穷大*/
}

/*路径选择函数*/
void path(MGragh G,int start,int end) /*s表示起始位置 e表示目标位置*/
{
int i,j,u,c=1,t,v,p=1,q=1;
int r[Number+1][Number+1];/*用来存放路径上节点,+1是因为从1开始*/
int T[Number],flag[Number],d[Number]; /*T数组用来存储路径中该顶点的前驱,flag存储是否已找到最短路径,d存储最短路径长度*/
for(i=0;i<=Number;i++)
for(j=0;j<=Number;j++)r[i][j]=0;/*路径数组初始化,初始值为0*/
for(i=1;i<=Number;i++)
{
T[i]=-1;/*初始值为-1。*/
flag[i]=1;/*初始值为1。*/
d[i]=MaxVerterNum;/*路径长度初始值为无穷大,用MaxVerterNum表示。 */
}
flag[start]=0;/*修改标识。*/

/*Dijkstra算法*/
if(start<=Number&&end<=Number)
{
while(c<=Number) /**/
{
t=MaxVerterNum;
/*开始Dijkstra的主循环,每次求得v0到某个顶点v的最短路径,并加v到s集*/
for(i=1;i<=Number;i++)/*因为从1开始,所以i取值为1*/
if(flag[i]&&G.edges[start][i]<t)
{t=G.edges[start][i];v=i;r[v][1]=v;} /*寻找“r数组&&flag数组最小”的顶点v;*/
for(i=1;i<=c;i++)
for(j=1;j<=Number;j++) /*修改其他顶点*/
if(flag[j]&&d[i]+G.edges[T[i]][j]<t)
{
t=d[i]+G.edges[T[i]][j];v=j;
if(r[v][0]!=-1)
{ u=1;
while(r[T[i]][u]!=0)
{r[v][u]=r[T[i]][u];u++;}
}
r[v][u]=v;/*把最短路径上的节点赋值给路径数组*/
}
r[v][0]=-1; /*存储路径数组*/
T[c]=v;
flag[v]=0;
d[c]=t;
c++;
}
printf("\nThe path is:\n\n[%d]",start);
j=1;
while(r[end][j]!=0)
{
printf("--->[%d]",r[end][j]);j++;
}/*显示路径。*/
printf("\n\n");
}
else printf("Input invalid score\n");
for(q=0;q<Number+1;q++)
{
for(p=0;p<Number+1;p++)
printf("%5d",r[q][p]);
printf("\n");
}
getch();
}

/*资料提示函数*/
void information(int i)
{
char a[MaxVerterNum];
FILE *fp;
switch(i)
{ case 1:fp=fopen("e:\\n1.txt","r");break;
case 2:fp=fopen("e:\\n2.txt","r");break;
case 3:fp=fopen("e:\\n3.txt","r");break;
case 4:fp=fopen("e:\\n4.txt","r");break;
case 5:fp=fopen("e:\\n5.txt","r");break;
case 6:fp=fopen("e:\\n6.txt","r");break;
case 7:fp=fopen("e:\\n7.txt","r");break;
case 8:fp=fopen("e:\\n8.txt","r");break;
case 9:fp=fopen("e:\\n9.txt","r");break;
case 10:fp=fopen("e:\\n10.txt","r");break;
default:printf("Input invalid score\n"); /*处理非法数据*/
}
if(fp==NULL)
{ printf("Wrong! No txt files!\n");
printf("\n[Press any key to continue]\n");
getch();
return;
}/*错误提示*/
else printf("\nThe information of the place:\n");

while(feof(fp)==0)
fgets(a,MaxVerterNum,fp);
printf("%s",a);/*显示文本内容*/
fclose(fp);/*关闭文本*/
printf("\n[Press any key to continue]\n");
getch();
return;
}
/*主函数*/
main()
{
MGragh G;
int i,j,choose=-1;
creat(&G);
while(choose!=0)
{ menu();
scanf("%d",&choose);
switch(choose)
{
case 1:printf("You need to know which attractions?\n");
scanf("%d",&i);
information(i);
break;
case 2:printf("You now located?\n");
scanf("%d",&i);
printf("Where do you want to go?\n");
scanf("%d",&j);
path(G,i,j);
creat(&G);
printf("\n[Press any key to continue]\n");
getch();
break;
case 0:break;
}
}
getchar();
}
</pre>
CloudStrifers 2012-10-19
  • 打赏
  • 举报
回复
嗯、查看了一下、有了一点思路了、

69,382

社区成员

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

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