数据结构实验(6)图的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机系数据结构实验报告(6)
实验目的:
图是应用极为广泛的数据结构,也是这门课程的重点,继续使学生更了解数据结构加操作的程序设计观点。
问题描述:
给出一张某公园的导游图,游客通过终端询问可知:
a)从某一景点到另一个景点的最短路径。
b)游客从公园大门进入,选一条最佳路线,使游客可以不重复的游览各景点,最后回到出口。实验要求:
1、将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值表示距离,选择适当的数据结构。
2、为游客提供图中任意景点相关信息的查询;
3、为游客提供任意两个景点之间的一条最短的简单路径。
4、为游客选择最佳游览路径。
算法分析:
1、设计公园平面图,选择适当的数据结构;
2、设计图的最短路径算法,如果有几条路径长度相同,选择途径景点较少的路径给游客;
3、设计图的深度优先搜索算法,如果有多种路径可选,则选带权路径最短的路线给游客;实验内容和过程:
源程序:
#include
using namespace std;
#include
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
#define VRType int
#define InfoType int
#define VertexType char
#define MAX 10
#define FALSE 0
#define TRUE 1
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcCell
{
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}MGraph;
void DFS(MGraph G,int v);
void VisitFunc(MGraph G,int v);
int FirstAdjVex(MGraph G,int v);
int NextAdjVex(MGraph G,int v,int w);
VertexType OutVex(MGraph G,int m);
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef int ShortPathTable[MAX_VERTEX_NUM];
int LocateVex(MGraph G,VertexType v)
{
int i=0;
for(i=0;G.vexs[i]!=v;++i);
return i;
}
VertexType OutVex(MGraph G,int m)
{
return G.vexs[m];
}
bool CreateUDN(MGraph &G)
{
int i,j,k;
char v1,v2;
int w;
G.kind=UDN;
cout<<"输入景点个数,道路条数:";
cin>>G.vexnum>>G.arcnum;
cout<<"输入各个景点:";
for(i=0;i cin>>G.vexs[i]; for(i=0;i for(j=0;j { G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } cout<<"输入每条道路依附的景点和道路长度:"< for(k=0;k { cin>>v1>>v2>>w; i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=w; G.arcs[j][i]=G.arcs[i][j]; } return true; } bool visited[MAX]; void DFSTraverse(MGraph G) { int v; for(v=0;v visited[v]=false; for(v=0;v if(!visited[v]) DFS(G,v); } void DFS(MGraph G,int v) { int w; visited[v]=true;VisitFunc(G,v); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) if(!visited[w]) DFS(G,w); } int FirstAdjVex(MGraph G,int v) { int i ; for(i = 0; i if( G.arcs[v][i].adj!=INFINITY ) return i; if(i == (G.vexnum-1)) return -1; return -1; } int NextAdjVex(MGraph G,int v,int w) { int i; for( i = w+1; i if(G.arcs[v][i].adj!=INFINITY) return i; if(i == (G.vexnum-1)) return -1; return -1; } void VisitFunc(MGraph G,int v) { cout< } void Shortestpath_DIJ(MGraph G, int v0, PathMatrix *p, ShortPathTable *D) { int v, w, i, j, min; int final[MAX_VERTEX_NUM]; for (v = 0; v < G.vexnum; v++) { final[v] = FALSE; (*D)[v] = G.arcs[v0][v].adj; 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;