4 旅游区导游图 (7人)
作者&投稿:祢菲 (若有异议请与网页底部的电邮联系)
导游图
各位游客,大家好,这里就是黑咕隆咚的兰亭风景区啦,话说有一天,一块巨石从天而降,上书遒劲“兰亭”二字,这二字极见功力,几经考究,发现竟是书圣王羲之的真迹!从此一传十,十传百,这块飞天巨石着陆地成了绍兴极具传奇色彩的风景区之一,千百年来文人骚客纷至沓来,共赏奇石,把酒作诗。所作之诗都镌于巨石之背,千载流传。话说这奇石有一妙,就是在四人帮破四旧之时,当时疯狂愚蠢的人们费劲全部蛮力妄图毁坏这块奇石都不能,足见此石有多刚硬。刚硬巨石,衬着书圣题字,顽强地走过了一个个蛮荒和不可思议的年代。看,而今巨石身边的景物都已暗黑一片,他依然本色地立在那里,啊,世界上毕竟有不可被染黑的东西。诶?游客们呢?都倒了啊。。。那我溜达去了。
#include"stdio.h"#include"malloc.h"
#include"string.h"
#include<iostream.h>
#define INFINITY 32767 /* 最大值∞ */
/* 根据图的权值类型,分别定义为最大整数或实数 */
#define MAX_VEX 30 /* 最大顶点数目 */
typedef enum {FALSE , TRUE} BOOLEAN ;
typedef struct MGraph{
char vexs[MAX_VEX];
int arcs[MAX_VEX][MAX_VEX];
int vexnum,arcnum;
}MGraph;
/*图的邻接链表表示结构有关定义*/
typedef struct Linknode{
char adjvex; /*邻接点在头结点数组中的位置(下标)*/
int info; /*与边或弧相关的信息, 如权值*/
struct Linknode *nextarc; /*指向下一个表结点*/
}LinkNode; /* 表结点类型定义 */
typedef struct VexNode{
char data; /*顶点信息*/
LinkNode *firstarc; /*指向第一个表结点*/
}VexNode; /* 顶点结点类型定义 */
typedef struct {
int vex1, vex2; /* 弧或边所依附的两个顶点 */
int info; /*与边或弧相关的信息, 如权值*/
}ArcType; /* 弧或边的结构定义 */
typedef struct{
int vexnum;
VexNode AdjList[MAX_VEX];
}ALGraph; /* 图的结构定义 */
////////////////////////////////////////////////////////////////////////////////////////////
/* 图的邻接链表表示 */
void Init_Graph(ALGraph * G){
/*图的初始化*/
printf("旅游区导游图的类型:带权无向图");
G->vexnum=0; /* 初始化顶点个数 */
}
int LocateVex(ALGraph *G, char vp) {
/*图的顶点定位*/
int k;
for(k=0; k<G->vexnum;k++)
if(G->AdjList[k].data==vp)
return(k);
return(-1); /* 图中无此顶点 */
}
int AddVertex(ALGraph *G, char vp)
{
if (G->vexnum>=MAX_VEX)
{
printf("图中顶点数已达到最多!\n");
return(-1);
}
if(LocateVex(G,vp)!=-1)
{
printf("所要添加的顶点已存在!\n");
return(-1);
}
G->AdjList[G->vexnum].data=vp;
G->AdjList[G->vexnum].firstarc=NULL;
++G->vexnum;
return 1;
}
int AddArc(ALGraph *G, ArcType *arc){
/*向图中增加一条边(弧)*/
int k,j;
LinkNode *p,*q;
k=LocateVex(G,arc->vex1);
j=LocateVex(G,arc->vex2);
if (k==-1||j==-1)
{
printf("该两个景点之间一点 或 两点都不存在,错误 !\n"); //////
return(-1);
}
p=(LinkNode *)malloc(sizeof(LinkNode));
p->adjvex=arc->vex1;
p->info=arc->info;
p->nextarc=NULL; /* 边的起始表结点赋值 */
q=(LinkNode *)malloc(sizeof(LinkNode));
q->adjvex=arc->vex2;
q->info=arc->info;
q->nextarc=NULL; /* 边的末尾表结点赋值 */
q->nextarc=G->AdjList[k].firstarc;
G->AdjList[k].firstarc=q;
p->nextarc=G->AdjList[j].firstarc;
G->AdjList[j].firstarc=p ;
return(1);
}
ALGraph *Create_ALGraph(){
/*采用邻接链表作为图的存储结构建立带权有向图*/
char stack1[6],stack2[6],vex,k1,k2;
int weight;
ALGraph *G;
ArcType *p;
printf("首先对旅游区导游图进行初始化!!!\n\n");
G=(ALGraph *)malloc(sizeof(ALGraph));
Init_Graph(G);
printf("\n请输入旅游区导游图的各个旅游景点代码(只允许是字符,不为字符串),0作为结束标志\n");
while(1)
{
scanf("%s",stack1);
vex=stack1[0];
if(vex=='0')
break;
else
AddVertex(G,vex);
}
p=(ArcType *)malloc(sizeof(ArcType));
printf("\n 以(Vi ,Vj ,d)的形式从键盘输入建立该旅游区的旅游景点图,\n 其中: Vi和Vj表示两个不同的旅游景点, d表示这两个景点之间的道路距离;\n 该旅游景点图采用邻接链表存储结构(第一个顶点是0时表示结束):\n");
while(1)
{
scanf("%s",stack1);
k1=stack1[0];
if (k1=='0') /* 输入第一个顶点,0结束 */
break;
else
{
scanf("%s",stack2) ;
scanf("%d",&weight) ; /* 输入第二个顶点和权值 */
k2=stack2[0];
p->vex1=k1;
p->vex2=k2;
p->info=weight;
AddArc(G,p) ;
printf("\n请继续输入下一条道路!!\n") ;
}
}
return(G);
}
void output_ALGraph(ALGraph *G){
/* 输出图的邻接链表 */
int j;
LinkNode *p;
printf("\n旅游区导游图的邻接链表表示如下:\n");
for (j=0;j<G->vexnum;j++)
{
printf("%c",G->AdjList[j].data);
p=G->AdjList[j].firstarc;
while(p!=NULL)
{
printf("->");
printf("<%c,%d>",p->adjvex,p->info);
p=p->nextarc;
}
printf("\n\n");
}
}
void output_Find_ALGraph(ALGraph *G){
/* 相邻景点查询并输出 */
int j;
LinkNode *p;
printf("请输入你要查询的景点(下标值):\n");
scanf("%d",&j);
p=G->AdjList[j].firstarc;
while(p)
{
printf("景点%c到景点%c的距离是%d (该两个景点之间有直接的道路相通)\n",G->AdjList[j].data,p->adjvex,p->info);
p=p->nextarc;
}
printf("\n\n");
}
void ListToMat(ALGraph G, MGraph &g){
/*将邻接链表转换成邻接矩阵*/
int k,i,j,n=G.vexnum;
LinkNode *p;
for (i=0;i<n;i++) /*g.arcs[i][j]赋初值0*/
for (j=0;j<n;j++)
g.arcs[i][j]=INFINITY;
for(i=0;i<G.vexnum;i++)
{
g.vexs[i]=G.AdjList[i].data;
}
for (i=0;i<n;i++)
{
p=G. AdjList[i].firstarc;
while (p!=NULL)
{
k=LocateVex(&G,p->adjvex);
g.arcs[i][k]=p->info;
p=p->nextarc;
}
}
g.vexnum=G.vexnum;
}
void display(ALGraph *G,MGraph g){
//输出邻接矩阵
int i,j;
ListToMat(*G, g);
for(i=0;i<G->vexnum;i++)
printf("%6c",G->AdjList[i].data );
printf("\n");
for(i=0;i<g.vexnum;i++)
{
for(j=0 ;j<g.vexnum ;j++)
{
printf("%6d", g.arcs[i][j]);
}
printf("\n");
}
}
void dijkshort_One(ALGraph F, MGraph G,int v0,int distance[], int pre[]){
// 带权图G从顶点v0到其他定点的最短距离distance和最短路径前驱结点的下标pre
int w;
int S[30],i,j,k,p,min;
ListToMat(F, G);
printf("你所要开始查询的景点是:%c\n",F.AdjList[v0].data);
for(i=0;i<G.vexnum;i++)
{
distance[i]=G.arcs[v0][i];
S[i]=0;
if(distance[i]<32767)
pre[i]=v0;
else
pre[i]=-1;
}
S[v0]=1; //顶点v0已加入到集合S中
for(i=0;i<G.vexnum;i++)
{
min=32767;
for(j=0;j<G.vexnum;j++)
{
if(!S[j]&&distance[j]<min)
{
min=distance[j];
k=j;
}
}
S[k]=1; ///将找到的顶点加入到集合S中
for(w=0;w<G.vexnum;w++) // /修改集合T中顶点的距离值
if(!S[w]&&distance[w]>distance[k]+G.arcs[k][w])
{
distance[w]=distance[k]+G.arcs[k][w];
pre[w]=k;
}
}
printf("查询结果:\n");
for(j=0;j<G.vexnum;j++) //输出结果
if(pre[j]!=-1)
{
printf("从景点%c到景点%c",F.AdjList[v0].data,G.vexs[j]);
p=pre[j];
printf("的最短距离是: %d",distance[j]);
printf(" 途中经过的景点有:");
while(p!=-1)
{
printf(" %c",G.vexs[p]);
p=pre[p];
}
printf("\n");
}
else if(j!=v0)
printf("\n%c到%c : no path",G.vexs[j],G.vexs[v0]);
}
void dijkshort_Two(ALGraph F, MGraph G,int v0,int distance[], int pre[]){
// 带权图G从顶点v0到其他定点的最短距离distance和最短路径前驱结点的下标pre
int w;
int S[30],i,j,k,p,min,d;
ListToMat(F, G);
printf("你所要开始查询的开始景点是:%c\n\n",F.AdjList[v0].data);
for(i=0;i<G.vexnum;i++)
{
distance[i]=G.arcs[v0][i];
S[i]=0;
if(distance[i]<32767)
pre[i]=v0;
else
pre[i]=-1;
}
S[v0]=1; //顶点v0已加入到集合S中
for(i=0;i<G.vexnum;i++)
{
min=32767;
for(j=0;j<G.vexnum;j++)
{
if(!S[j]&&distance[j]<min)
{
min=distance[j];
k=j;
}
}
S[k]=1; ///将找到的顶点加入到集合S中
for(w=0;w<G.vexnum;w++) // /修改集合T中顶点的距离值
if(!S[w]&&distance[w]>distance[k]+G.arcs[k][w])
{
distance[w]=distance[k]+G.arcs[k][w];
pre[w]=k;
}
}
printf("输入你要查询的另外一个景点(下标值):");
scanf("%d",&d);
printf("你要查询的另外一个景点是:%c\n",G.vexs[d]);
printf("\n查询结果:\n"); //输出结果
if(pre[d]!=-1)
{
printf("从景点%c到景点%c",F.AdjList[v0].data,G.vexs[d]);
p=pre[d];
printf("的最短距离是: %d",distance[d]);
printf(" 途中经过的景点有:");
while(p!=-1)
{
printf(" %c",G.vexs[p]);
p=pre[p];
}
printf("\n");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* ------------菜单------------*/
void main()
{
int n,v0;
MGraph g;
int distance[MAX_VEX],pre[2*MAX_VEX];
ALGraph *G;
printf("┏┉┉┉┉┉┉┉┉┉┉┉┉┓\n");
printf("┋ 欢迎使用旅游区导游系统 ┋\n");
printf("┗┉┉┉┉┉┉┉┉┉┉┉┉┛\n");
do
{
printf("\n请选择对旅游区导游图的操作:\n\n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃ 1.建立旅游区导游图的邻接链表 ┃\n");
printf(" ┃ 2.旅游区导游图的邻接链表的输出 ┃\n");
printf(" ┃ 3.旅游区导游图的邻接矩阵的输出 ┃\n");
printf(" ┃ 4.相邻景点查询 ┃\n");
printf(" ┃ 5.景点路线查询 ┃\n");
printf(" ┃ 6.景点路线综合查询 ┃\n");
printf(" ┃ 7.退出操作 ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━━┛\n");
do
{
scanf("%d",&n);
}
while (n<1||n>8);
switch(n)
{
case 1:
{
G=(ALGraph *)malloc(sizeof(ALGraph));
G=Create_ALGraph();
printf("\n\n");
break;
}
case 2:
{
printf("\n旅游导游图的邻接链表表示如下所示:\n");
output_ALGraph(G);
printf("\n\n");
break;
}
case 3:
{
printf("\n旅游区导游图的邻接矩阵表示如下所示:\n");
display(G,g);
printf("\n\n");
break;
}
case 4:
{
output_Find_ALGraph(G);
printf("\n\n");
break;
}
case 5:
{
printf("输入你要查询的景点(下标值):");
scanf(" %d",&v0);
dijkshort_One(*G,g,v0,distance,pre);
break;
}
case 6:
{
printf("输入你要查询的开始景点(下标值):");
scanf(" %d",&v0);
dijkshort_Two(*G,g,v0,distance,pre);
break;
}
}
}
while(n!=7);
}
http://wenku.baidu.com/view/52c7036ab84ae45c3b358cd3.html?st=1
星河环欣: 写作导游解说词的注意事项 1、知识性 知识靠平时积累,但也要靠针对性地查询.如前面那则浙江导游考试的说明说到,杭州市考生可以按路线到灵隐、岳坟等景点现场解说,即使如此,也肯定要事先查询好这些景点的介绍资料,比如历史知...
武川县14712437850: 外出旅游安全注意事项 - ?
星河环欣: 1.爬山等户外运动带好必要的措施. 2.带好必需应急药品,比如创可贴,退烧药等. 3.酒店住宿的话,最好带好生活必需品,可以在淘宝上买一次性毛巾,床单等;观察一下逃生通道位置,以防万一. 4.女生单独外出,可以带一些防身工具,酒...
武川县14712437850: ·有没有介绍莱芜旅游景点的导游词 - ?
星河环欣: ①齐鲁大峡谷旅游区 ②房干生态旅游区 ③“天上人家”王石门旅游区 ④黑龙潭景区 ⑤雪野湖省级风景名胜区 ⑥棋山省级森林公园 ⑦华山省级森林公园 ⑧莱芜战役纪念馆 ①齐鲁大峡谷旅游区 该旅游区位于莱芜市西北部与济南之间的群山环抱之...
武川县14712437850: 旅游公司岗位包括哪些 - ?
星河环欣: 如果是一个比较大的社,那么它分的就会比较细致了,正规来说,应该有以下部门的: 1 财务部 岗位:会计 2 策划部 策划 3 外联部 业务、外联员 4 导游部 导游 5 票务部 航空售票员、送票人 6 计调部 计调员 7 接待部 接待员 8 下属旅游车队 司机 附: 9 有些旅行社有了网络部 岗位:网络维护
武川县14712437850: 旅游一般注意事项 - ?
星河环欣: 1、搭乘飞机时,应注意飞行安全,扣好安全带,不带危险或易燃品,不在飞机升降期 间使...
武川县14712437850: 导游领队人员兼具两个职责应该具备 - ?
星河环欣: 4.1.1.1导游领队人员应兼具为旅游者提供服务,与引导旅游者文明旅游两项职责. 4.1.1.2导游领队人员在引导旅游者文明旅游过程中应体现服务态度、坚持服务原则,在服务旅游者过程中应包含引导旅游者文明旅游的内容. 4.1.2 掌握知识 ...
武川县14712437850: 内蒙古九龙湾如何准备导游词? ?
星河环欣: 九龙湾位于卓资县西北部,在旗下营镇和红如乡境内,南距京包铁路仅6公里,西距... 九龙湾旅游区以其山、溪、瀑、泉而著称.这里山崖陡峭,郁郁葱葱的桦树林将大山...