最短路径实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
云南财经大学信息学院学生综合性与设计性实验报告
(2013—2014 学年第 2 学期)
周次:第7周日期:2014年 4 月 17 日地点:
一、实验内容与目的
1.内容
查看“最短路径.swf”,选择熟悉的程序设计语言定义有向图,根据动画演示求取从有向图任一结点到其他结点的最短路径。
2.实验目的
了解最短路径的概论,掌握求最短路径的方法。
二、实验原理或技术路线(可使用流程图描述)
实验原理:(李燕妮负责设计,周丽琼负责编程)
图是由结点的有穷集合V和边的集合E组成,求最短路径用迪杰斯特拉算法:
1)适用条件&范围:
a) 单源最短路径(从源点s到其它所有顶点v);
b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图)
c) 所有边权非负(任取(i,j)∈E都有Wij≥0);
2)算法描述:
a)初始化:dis[v]=maxint(v∈V,v≠s); dis[s]=0; pre[s]=s; S={s};
b)For i:=1 to n
1.取V-S中的一顶点u使得dis[u]=min{dis[v]|v∈V-S}
2.S=S+{u}
3.For V-S中每个顶点v do Relax(u,v,Wu,v)
c)算法结束:dis[i]为s到i的最短距离;pre[i]为i的前驱节点
三、实验环境条件(使用的软件环境)
Microsoft Visual C++6.0
四、实验方法、步骤(列出程序代码或操作过程)
/*本程序的功能是求图中任意两点间的最短路径*/
#include
#include
#include
#include
#define ING 9999
typedef struct ArcCell{
int adj;
/*顶点关系类型,用1表示相邻,0表示不相邻*/
}ArcCell,**AdjMatrix;
/*邻接矩阵*/
typedef struct type{
char data[3];
/*顶点值*/
}VertexType;
typedef struct{
VertexType *vexs; /*顶点向量*/
AdjMatrix arcs; /*邻接矩阵*/
int vexnum,arcnum; /*图的顶点数和边数*/
}MGraph;
/*初始图*/
void InitGraph(MGraph *G)
{
int i,nu,mu;
printf("\n输入顶点的个数和(边)弧的个数:");
scanf("%d %d",&nu,&mu);
G->arcs=(ArcCell **)malloc(nu*sizeof(ArcCell *));
for(i=0;i /*分配邻接矩阵空间*/ G->arcs[i]=(ArcCell *)malloc(nu*sizeof(ArcCell)); G->vexs=(VertexType *)malloc(nu*sizeof(VertexType)); /*分配顶点空间*/ G->vexnum=nu;G->arcnum=mu; /*图的顶点数和边数*/ } void InsertGraph(MGraph *G,int i,VertexType e) { if(i<0||i>G->vexnum) return; strcpy(G->vexs[i].data,e.data); } /*确定v1在图顶点中的位置*/ int Locate(MGraph G,VertexType v1) { int i; for(i=0;i if(strcmp(v1.data,G.vexs[i].data)==0) return i; return -1; } /*采用数组(邻接矩阵)和邻接表表示无向图*/ void CreateUND(MGraph *G) { int i,j,k,*p,w; VertexType v1,v2; p=(int *)malloc(G->vexnum*sizeof(int)); for(i=0;i<10;i++) p[i]=0; for(i=0;i { for(j=0;j G->arcs[i][j].adj=ING; } for(k=0;k { printf("\n输入第%d 条(边)弧相对的两个顶点值:\n",k+1); scanf("%s %s",v1.data,v2.data); /*输入相邻的两个点值*/ printf("输入它们的权值: "); scanf("%d",&w); i=Locate(*G,v1);j=Locate(*G,v2); /*用i 和j来确定它们的位置*/ G->arcs[i][j].adj=w; } } /*输出邻接矩阵*/ void Pint(MGraph G) {