当前位置:文档之家› 数据结构-实验五-图

数据结构-实验五-图

数据结构与算法课程实验报告实验五:图的相关算法应用
姓名:cll
班级:
学号:
【程序运行效果】
一、实验内容:
求有向网络中任意两点之间的最短路
实验目的:
掌握图和网络的定义,掌握图的邻接矩阵、邻接表和十字链表等存储表示。

掌握图的深度和广度遍历算法,掌握求网络的最短路的标号法和floyd算法。

二、问题描述:
对于下面一张若干个城市以及城市间距离的地图,从地图中所有可能的路径中求出任意两个城市间的最短距离及路径,给出任意两个城市间的最短距离值及途径的各个城市。

三、问题的实现:
3.1数据类型的定义
#define MAXVEX 50 //最大的顶点个数
#define MAX 100000
typedef struct{
char name[5]; //城市的名称
}DataType; //数据结构类型
typedef struct{
int arcs[MAXVEX][MAXVEX]; //临接矩阵
DataType data[MAXVEX]; //顶点信息
int vexs; //顶点数
}MGraph,*AdjMetrix; //邻接矩阵表示图
3.2主要的实现思路:
用邻接矩阵的方法表示各城市直接路线的图,之后用Floyd算法求解两点直接的最短距离,并用递归的方法求出途经的城市。

主要源程序代码:
#include<stdio.h>
#include<string.h>
#define MAXVEX 50
#define MAX 100000
typedef struct{
char name[5]; //城市的名称
}DataType; //数据结构类型
typedef struct{
int arcs[MAXVEX][MAXVEX]; //临接矩阵
DataType data[MAXVEX]; //顶点信息
int vexs; //顶点数
}MGraph,*AdjMetrix;
//创建临接矩阵
void CreatGraph(AdjMetrix g,int m[][MAXVEX],DataType d[],int n){
/*g表示邻接矩阵,m[][MAXVEX]表示输入的邻接矩阵,d[]表示各城市的名称,n表示城市数目*/
int i,j;
g->vexs = n;
for(i=0;i < g->vexs;i++){
g->data[i] = d[i];
for(j=0;j<g->vexs;j++){
g->arcs[i][j] = m[i][j];
}
}
}
//求最短路径
void Floyd(AdjMetrix g,int F[][10],int path[][10]){
int i,j,k;
for(i=0;i<g->vexs;i++){
for(j=0;j<g->vexs;j++){
F[i][j] = g->arcs[i][j]; //初始化最短路径
path[i][j] = -1; //初始化路径为-1
}
}
//递推过程
for(k=0;k<g->vexs;k++){
for(i=0;i<g->vexs;i++){
for(j=0;j<g->vexs;j++){
if(F[i][j] > F[i][k]+F[k][j]){
F[i][j] = F[i][k] + F[k][j]; //更新最短距离的大小
path[i][j]=k;//保存两点之间最短路径经过的点
}
}
}
}
}
//递归实现最短路径途经的各个城市打印
void out(int a,int b,int path[][10],AdjMetrix g){
/*a表示起点城市,b表示终点城市,g表示邻接矩阵*/
if(path[a][b] == -1){
return; //说明该两点直接无途经的城市
}
out(a,path[a][b],path,g);
printf("%s->",g->data[path[a][b]].name);
out(path[a][b],b,path,g);
}
//主函数
void main(){
MGraph gg;
AdjMetrix g = &gg;
DataType d[10] ={{0,"郑州"},{1,"北京"},{2,"天津"},{3,"南昌"},{4,"上海"},{5,"贵阳"},{6,"株洲"},{7,"广州"},{8,"兰州"},{9,"西宁"}};
int m[][MAXVEX] = {
{0,45,35,50,MAX,MAX,40,MAX,MAX,MAX},
{45,0,20,MAX,MAX,90,MAX,MAX,70,MAX},
{35,20,0,MAX,50,MAX,MAX,MAX,MAX,MAX},
{50,MAX,MAX,0,50,MAX,40,MAX,MAX,MAX},
{MAX,MAX,50,50,0,MAX,MAX,MAX,MAX,MAX},
{MAX,50,MAX,MAX,MAX,0,20,50,50,MAX},
{40,MAX,MAX,40,MAX,20,0,MAX,MAX,MAX},
{MAX,MAX,MAX,MAX,MAX,MAX,50,0,MAX,MAX},
{MAX,70,MAX,MAX,MAX,50,MAX,MAX,0,35},
{MAX,MAX,MAX,MAX,MAX,MAX,MAX,MAX,35,0},
};
CreatGraph(g,m,d,10); //创建临接矩阵
int F[10][10];
int path[10][10];
Floyd(g,F,path); //求最短路径
printf("******欢迎查询最短路径*****\n");
int choice=0;
while(choice == 0){
printf("请输入起点的名称:\n");
int b=-1;
char begin[5];
do{
scanf("%s",&begin);
int i;
for(i=0;i<10;i++){
if(!strcmp(begin,d[i].name)){
b = i;
}
}
if(b==-1){
printf("输入有误,请重新输入起点:\n");
}
}while(b==-1);
printf("请输入终点的名称:\n");
int L=-1;
char Last[5];
do{
scanf("%s",&Last);
int i;
for(i=0;i<10;i++){
if(!strcmp(Last,d[i].name)){
L = i;
}
}
if(L==-1){
printf("输入有误,请重新输入终点:\n");
}
}while(L==-1);
printf("\t%s到%s的最短距离为%d\t\n",begin,Last,F[b][L]);
printf("\t最短路径是:%s->",gg.data[b].name);
out(b,L,path,g);
printf("%s\n",gg.data[L].name);
printf("是否继续查询:0.查询;1.退出:\t");
scanf("%d",&choice) ;
}
}
总结:
1、Floyd求解任意两点间的最短距离,时间复杂度为O(n^3)。

2、算法中F[][]用于保存最短距离,F[][]初始时为两点间的直接距离
3、path[][]用于保存路径,若等于-1 则说明两点间的最短路径不经过其他点。

4、当图的边数远远小于图的顶点数的时候,邻接矩阵就变成了稀疏矩阵,此时邻接矩阵存储图就会浪费大量存储空间。

注:源程序见附件1.。

相关主题