第一篇:旅游区导游图
旅游区导游图
题目内容: 问题描述:
设某个旅游区共有n个旅游景点(n≥10),每个旅游景点都和相邻的m个旅游景点(m≥2,m 以(Vi ,Vj ,d)的形式从键盘输入建立该旅游区的旅游景点图,其中:Vi和Vj表示两个不同的旅游景点,d表示这两个景点之间的道路距离;该旅游景点图采用邻接链表存储结构。实现要求: ⑴ 旅游景点图的输出:分别以邻接矩阵、邻接链表的方式输出该旅游景点图。⑵ 相邻景点查询:假设对于每个景点,设置有简易的信息查询,要求能给出与该景点相邻的所有景点(有直接的道路相通)及对应的距离。 ⑶ 景点路线查询:假设对于每个景点,设置有景点路线查询,要求能给出从该景点出发到任一其它景点的最短简单路径及距离。 ⑷ 景点路线综合查询:对于该旅游区的任意两个景点,找出它们之间的最短简单路径及距离。 ⑸ 最佳旅游路线确定:假设该旅游区的入口也是出口,请确定一条最佳的旅游线路,该线路必须经过所有的旅游景点(有些景点可以重复经过)且走的路最短。⑹ 设计一个菜单,上述操作要求都作为菜单中的主要菜单项。 代 码 如 下: ································ #include“stdio.h” #include“malloc.h” #include “string.h” #define INFINITY 32767 /* 图的最大权值,32767是整数表示的最大值*/ #define MAX_VEX 30 /* 最大顶点数目 */ #define MAX_VALUE 999999999 typedef int InfoType;typedef char VexType;typedef enum{DG=1, AG=2, WDG=3,WAG=4}GraphKind;/*枚举常量定义旅游景点对应的图类型*/ typedef struct Path { int vertex[MAX_VEX];int value;int count;}GPath; typedef struct MGraph { char vexs[MAX_VEX]; /*存放图的邻接矩阵的的顶点,顶点向量 */ int arcs[MAX_VEX][MAX_VEX]; /*存放图的邻接矩阵的边 */ int vexnum,arcnum; /*图的当前顶点数和弧数 */ }MGraph; /*图的邻接链表转换为矩阵后,图的结构定义 */ /*图的邻接矩阵存储结构中结点结构体的定义*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct Linknode { char adjvex; /*邻接点在头结点数组中的位置(邻接边的弧头顶点序号)*/ InfoType info; /*与边或弧相关的信息, 如权值 */ struct Linknode *nextarc; /*指向下一个表结点 */ }LinkNode; /*邻接边单链表的结点结构体 */ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct VexNode { char data; /*数据域存储顶点信息 */ int indegree; /*顶点的度, 有向图是入度或出度或没有 */ LinkNode *firstarc; /*链域指向第一个表结点(邻接边头指针)*/ }VexNode; /*顶点结点类型定义 */ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct { GraphKind kind; /*图的种类标志 */ int vexnum; /*顶点个数 */ VexNode AdjList[MAX_VEX]; /*邻接表数组 */ }ALGraph; /*图的结构定义 */ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct { VexType vex1, vex2; /*弧或边所依附的两个顶点 */ InfoType info; /*与边或弧相关的信息, 如权值 */ }ArcType; /*弧或边的结构定义 */ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Init_Graph(ALGraph * G) /*图的初始化 */ { do { printf(“请确认旅游景点的类型(1:无向图。2:有向图。3:带权有向图。4:带权无向图):n”); } scanf(“%d”, &G->kind);if(G->kind==4)printf(“旅游区导游图的类型:带权无向图n”);else { } printf(“ ●您选择的图的类型不对●n”); while(G->kind!=4);G->vexnum=0; /* 初始化顶点个数为0 */ } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int LocateVex(ALGraph *G, VexType vp) /*图的顶点定位(图的顶点定位实际上是确定一个顶点在AdjList数组中的某个元素的data域内容。)*/ { int k;for(k=0;k /*如果存在此顶点返回顶点数组下标值 return(-1); /*如果没有则返回-1(图中无此顶点) */ */ } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int AddVertex(ALGraph *G, char vp) /*向图中增加顶点(向图中增加一个顶点的操作,在AdjList数组的末尾增加一个数据元素。)*/ { int k;if(G->vexnum>=MAX_VEX){ } if(LocateVex(G,vp)!=-1){ printf(“所要添加的顶点已存在!n”);printf(“图中顶点数已达到最多!n”); return(-1);return(-1);} G->AdjList[G->vexnum].data=vp;G->AdjList[G->vexnum].indegree=0;G->AdjList[G->vexnum].firstarc=NULL;k=++G->vexnum;return k;} /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 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); /*无向图,把p和q互相连接到彼此的边点上 */ } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ALGraph *Create_ALGraph()/*采用邻接链表作为图的存储结构建立带权有向图*/ { char stack1[MAX_VEX],stack2[MAX_VEX],vex,k1,k2;int weight;ALGraph *G;ArcType *p;printf(“首先对旅游区导游图进行初始化:nn”);G=(ALGraph *)malloc(sizeof(ALGraph));//申请动态结点空间 Init_Graph(G);printf(“n请输入旅游区导游图的各个旅游景点代码(以字符的形式出入),当输入0时作为结束标志n”);while(1){ scanf(“%s”,stack1);/*以字符串的形式输入存储旅游区景点,一次一个的存储输入的景点存到数组中之后又在图中插入该顶点,当输入0时结束*/ 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) // 2:输出图的邻接链表 { int j;LinkNode *p; printf(“n旅游区导游图的邻接链表景点输出表示如下:n”);for(j=0;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(“nn”);} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void output_Find_ALGraph(ALGraph *G) // 4:相邻景点查询并输出 { int j;LinkNode *p; //定义邻接边单链表结点p printf(“请输入您要查询的景点(顶点数组下标值):n”); //从输入的景点开始找和其相邻的景点并输出权值 scanf(“%d”,&j); p=G->AdjList[j].firstarc; //定义邻接边头指针 while(p!=NULL){ printf(“景点%c到景点%c的距离是%d(两景点之间有相连的道路)n”,G->AdjList[j].data,p->adjvex,p->info);//第j个景点和他下一个相邻的景点和权值 p=p->nextarc; //指向下一个结点的地址,使全部与G->AdjList[j].data直接连通的顶点全部输出,NULL时截止 } printf(“nn”);} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void ListToMat(ALGraph G, MGraph &g) /*将邻接链表转换成邻接矩阵 */ { int k,i,j; LinkNode *p;for(i=0;i /*g.arcs[i][j]赋初值INFINITY for(j=0;j g.arcs[i][j]=INFINITY;for(i=0;i /*把链表的数组顶点保存到数组vexs[i]} for(i=0;i p=G.AdjList[i].firstarc;while(p!=NULL) { k=LocateVex(&G,p->adjvex); /*取和p相邻的顶点下标值用于邻接*/ 中*/ 矩阵的下标值 */ g.arcs[i][k]=g.arcs[k][i]=p->info;/*把权值赋值给二维数组用于矩阵输出 */ */ } } p=p->nextarc; /*指向下一个邻接表结点 } g.vexnum=G.vexnum;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void display(ALGraph *G,MGraph g) /*3:输出邻接矩阵 */ { int i,j;ListToMat(*G, g); /*将邻接链表转换成邻接矩阵 */ printf(“ ”);for(i=0;i /*输出矩阵横向顶点值 */ printf(“n”);for(i=0;i printf(“%c ”,G->AdjList[i].data); /*输出矩阵竖向顶点值,每输出一行输出一次顶点*/ } } for(j=0;j if(g.arcs[i][j]==INFINITY) printf(“∞ ”);else printf(“%-8d”, g.arcs[i][j]); /*每个权值占有8个字符,负号表示左端对齐 */ } printf(“n”);//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void dijkshort_One(ALGraph F, MGraph G,int v0,int distance[], int path[])/* 带权图G从顶点v0到其他定点的最短距离distance和最短路径前驱结点的下标path*/ //带权图F从下标v0到其他顶点的最短距离diatance和最短路径下标path,path中存放了从输入的v0到其他各个顶点的最短路径的前一个顶点的下标 //基于狄克斯特拉函数的设计 { int *S=(int *)malloc(sizeof(int)*G.vexnum);int minDis,i,j,u,p; ListToMat(F, G);printf(“你所要开始查询的景点是:%cn”,F.AdjList[v0].data);for(i=0;i distance[i]=G.arcs[v0][i];S[i]=0;if(distance[i] path[i]=-1;} S[v0]=1; //标记顶点v0已从集合T加入到集合S中(以v0为下标值的顶点)for(i=0;i minDis=INFINITY;for(j=0;j { minDis=distance[j]; u=j;} } S[u]=1; //标记顶点u已从集合T加入到集合S中(以u为下标值的顶点) for(j=0;j // /修改从v0到其他顶点的最短距离和最短路径 if(S[j]==0&&G.arcs[u][j] } } //顶点v0到其他所有的顶点的最短距离已经保存在数组distance中 printf(“查询结果是:n”);for(j=0;j if(path[j]!=-1){ printf(“从景点%c到景点%c”,F.AdjList[v0].data,G.vexs[j]); p=path[j]; printf(“的最短距离是: %d”,distance[j]);//输出顶点v0到其他所有的顶点的最短printf(“ 途中经过的景点有:”);while(p!=-1){ printf(“ %c”,G.vexs[p]); 路径 } p=path[p];} printf(“n”); } else if(j!=v0) printf(“n%c到%c : 没有通路!”,G.vexs[j],G.vexs[v0]);/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void dijkshort_Two(ALGraph F, MGraph G,int v0,int distance[], int path[])/*带权图G从顶点v0到其他定点的最短距离distance和最短路径前驱结点的下标path*/ { int w;int S[30],i,j,k,p,min,d;ListToMat(F, G);printf(“你所要开始查询的开始景点是:%cnn”,F.AdjList[v0].data);for(i=0;i { distance[i]=G.arcs[v0][i];S[i]=0;if(distance[i] //顶点v0已加入到集合S中 for(i=0;i min=INFINITY;for(j=0;j if(!S[j]&&distance[j] { } min=distance[j];k=j;} S[k]=1; ///将找到的顶点加入到集合S中 for(w=0;w // /修改集合T中顶点的距离值 if(!S[w]&&distance[w]>distance[k]+G.arcs[k][w]){ distance[w]=distance[k]+G.arcs[k][w];} path[w]=k;} printf(“输入你要查询的另外一个景点(下标值):”);scanf(“%d”,&d);printf(“你要查询的另外一个景点是:%cn”,G.vexs[d]);printf(“n查询结果:n”);//输出结果 if(path[d]!=-1){ printf(“从景点%c到景点%c”,F.AdjList[v0].data,G.vexs[d]); p=path[d];printf(“的最短距离是: %d”,distance[d]);printf(“ 途中经过的景点有:”);while(p!=-1){ printf(“ %c”,G.vexs[p]);p=path[p];} printf(“n”);} } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void dfs_path(ALGraph *g,int src,int cur,int vis[],GPath *cur_path,GPath * min_path){ LinkNode * node =g->AdjList[cur].firstarc;for(;node!=NULL;node=node->nextarc)/*起始条件为node =g->AdjList[cur].firstarc*/ { } char adj=node->adjvex;int index=LocateVex(g,adj);if(vis[index]==0){ } cur_path->vertex[cur_path->count++]=index;cur_path->value+=node->info;vis[index]=1;dfs_path(g,src,index,vis,cur_path,min_path);cur_path->count--;cur_path->value-=node->info;vis[index]=0;if(vis[src]){ } if(cur_path->count==g->vexnum){ if(cur_path->value min_path.value=MAX_VALUE;dfs_path(g,src,src,vis,&cur_path,&min_path);if(min_path.value!=MAX_VALUE){ int i=0;printf(“n最佳旅游路线景点下标值是:n”);for(i=0;i printf(“%d->”,min_path.vertex[i]);} printf(“n”);printf(“n最佳旅游路线景点是:n”); for(i=0;i { printf(“%c-> ”,g->AdjList[min_path.vertex[i]].data); } } printf(“n”);}else { printf(“建立的图中没有最佳路径n”);} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*------------菜单------------*/ void main(){ int n,v0;MGraph g;int distance[MAX_VEX],path[2*MAX_VEX];ALGraph *G; printf(“ ============================n”); printf(“ !欢迎使用旅游区导游系统 !n”);printf(“ ============================n”);do { printf(“n请选择对该旅游区导游图的操作→nn”); printf(“ ┏━━━━━━━━━━━━━━━━━━━━━┓n”);printf(“ ┃ 1.建立旅游区导游图的邻接链表存储 ┃n”);printf(“ ┃ 2.旅游区导游图的邻接链表的输出 ┃n”);printf(“ ┃ 3.旅游区导游图的邻接矩阵的输出 ┃n”);printf(“ ┃ 4.相邻景点查询 ┃n”);printf(“ ┃ 5.景点路线查询 ┃n”);printf(“ ┃ 6.景点路线综合查询(查询两景点最短路径)┃n”);printf(“ ┃ 7.最佳路径 ┃n”);printf(“ ┃ 8.退出 ┃n”);printf(“ ┗━━━━━━━━━━━━━━━━━━━━━┛n”);do { } scanf(“%d”,&n);while(n<1||n>9);switch(n){ case 1: { G=(ALGraph *)malloc(sizeof(ALGraph));/*动态申请图G的内存空间*/ G=Create_ALGraph();printf(“nn”);break; } case 2: { } { printf(“n旅游导游图的邻接链表表示如下所示:n”);output_ALGraph(G);printf(“nn”);break;case 3: printf(“n旅游区导游图的邻接矩阵表示如下所示:n”);printf(“n∞表示两景点之间不存在连通的路线n”);printf(“n数值表示两景点之间的路线长度n”);display(G,g);printf(“nn”);break; } case 4: { } case 5: { } case 6: { } case 7: { } } } while(n!=8);} output_Find_ALGraph(G);printf(“nn”);break;printf(“输入你要查询的景点(下标值):”);scanf(“ %d”,&v0);dijkshort_One(*G,g,v0,distance,path);break;printf(“输入你要查询的开始景点(下标值):”);scanf(“ %d”,&v0);dijkshort_Two(*G,g,v0,distance,path);break;printf(“输入你要查询的开始景点(下标值):”);scanf(“%d”,&v0);printf(“景点是%c ”,G->AdjList[v0].data);best_path(G,v0);break; 课程设计任务书 2013~2014学年第 1 学期 学生姓名:专业班级:2012网络工程(1)班 指导教师:冯珊工作部门:计算机学院 一、课程设计题目: 公园导游图 二、课程设计内容 给出一张某公园的导游图,游客通过终端询问可知:从某一景点到另一景点的最短路径。游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览各景点,最后回到出口(出口就在入口旁边)。 三、进度安排 1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2. 完成最低要求:建立一个文件,包括5个景点情况,能完成遍历功能; 3. 进一步要求:进一步扩充景点数目,画出景点图,有兴趣的同学可以自己扩充系统功能。 四、基本要求 1.界面友好,函数功能要划分好 2.总体设计应画一流程图 3.程序要加必要的注释 4.要提供程序测试方案 5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价 值的。 数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 实验四:图(内容:某公园导游图) 一、问题描述: 公园导游系统:给出一张某公园的导游图,游客通过终端询问可知︰从某一景到另一景点的最短路径。游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览各景点,最后回到出口(出口就在入口旁边)。 二、设计描述: 1.输入导游图的算法(存储方法).本程序特地设计函数void initgraph()用于实现键盘输入图的结构; 2.可访问导游图中任一景点的算法.为此设计了函数void vist(GraphMatrix graph)用于实现访问任一景点的信息; 3.最短路径从一景点到另一景点的算法。利用floyd算法-实现每一对景点间的最短路径。并利用void outgraph()函数实现显示起始点和终点间的最短路径和其长度; 三、程序清单: #include typedef char VexType;数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 typedef float AdjType;typedef struct //定义图结构 { int n; /* 图的顶点个数 */ VexType vexs[MAXVEX]; /* 顶点信息 */ AdjType arcs[MAXVEX][MAXVEX]; /* 边信息 */ } GraphMatrix;GraphMatrix graph; //定义一个图graph typedef struct //定义最短路径ShortPath结构 { AdjType a[MAXVEX][MAXVEX]; /* 关系矩阵A,存放每对顶点间最短路径长度 */ int nextvex[MAXVEX][MAXVEX]; /* nextvex[i][j]存放vi到vj最短路径上vi的后继顶点的下标值 */ } ShortPath;ShortPath path; //定义路径path void floyd(GraphMatrix * pgraph, ShortPath * ppath) //floyd算法-用于实现每一对景点间的最短路径 { int i, j, k; for(i = 0;i < pgraph->n;i++) for(j = 0;j < pgraph->n;j++){ if(pgraph->arcs[i][j]!= MAX) ppath->nextvex[i][j] = j;数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 else ppath->nextvex[i][j] =-1; ppath->a[i][j] = pgraph->arcs[i][j]; } for(k = 0;k < pgraph->n;k++) for(i = 0;i < pgraph->n;i++) for(j = 0;j < pgraph->n;j++){ if(ppath->a[i][k] >= MAX || ppath->a[k][j] >= MAX) continue; if(ppath->a[i][j] > ppath->a[i][k]+ ppath->a[k][j]){ ppath->a[i][j] = ppath->a[i][k] + ppath->a[k][j]; ppath->nextvex[i][j] = ppath->nextvex[i][k]; } } } void outgraph() //out()函数用于实现显示起始点和终点间的最短路径和其长度 { int c,b,i;cout< //输入要查找起始点和终点(本程序限于编号(int型))cout< //通过path.a[c][b]把路径长度赋给i 数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 cout<<“该路径总长为:”;cout< //输出路径长度 cout<<“所得路径顺序为”;cout< //此处输出路径的第一个编号 c=path.nextvex[c][b]; for(;c!=b;c=path.nextvex[c][b]) //循环顺序输出路径始点和终点之间的景点编号 cout<<“,”< //再输出路径的最后一个编号 cout< //该函数用于实现键盘输入图的结构 { int i,m,j;printf(“请输入公园景点的个数:”); //图结点的个数赋给graph.n scanf(“%d”,&m);graph.n=m;for(i=0;i //循环输入结点顶点信息 { printf(“请输入第%i个景点信息:”,i);//为了简明起见此程序结点顶点信息限于字符型 cin>>graph.vexs[i];} printf(“请输入公园的邻接矩阵的信息n”);//循环输入图的邻接矩阵信息(也就是输入一个二维数组)for(i=0;i 班级:06软件工程 姓名:周邓雄 学号:06517037 for(j=0;j printf(“请输入第%d行,第%d列的元素:”,i+1,j+1);cin>>graph.arcs[i][j];} } void vist(GraphMatrix graph) //函数用于实现访问任一景点的信息 { int i; cout< cout<<“你想知道哪个景点的信息:”;//注意输入的是景点的编号 cin>>i; cout< cout<<“景点信息查询结果为:”; cout< cout< //用于判断是否继续执行特定的下一步程序 {int a;cout<<“还想继续查询?(1&0)”;cin>>a;return a;} int main()数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 { int i,j; initgraph(); //initgraph()函数来实现键盘输入图的结构 floyd(&graph, &path); cout<<“为了验证下面运算结果的方便,循环输出nextvex[i][j]数组”; for(i = 0;i < graph.n;i++) { for(j = 0;j < graph.n;j++) //为了验证下面运算结果的方便,循环输出nextvex[i][j]数组 printf(“%d ”, path.nextvex[i][j]); //nextvex[i][j]存放vi到vj最短路径上vi的后继顶点的下标值 putchar('n'); } cout< outgraph(); while(jud()) outgraph(); //outgraph()函数用于实现显示起始点和终点间的最短路径和其长度 vist(graph); //函数用于实现访问任一景点的信息 cout< while(jud()) vist(graph); cout< return 0;} 数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 验四:图(内容:某公园导游图) .问题描述 ① 给出一张某公园的导游图,游客通过终端询问可知: (1)从某一景点到另一景点的最短路径。 (2)游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览景点,最后回到出口(出口就在入口处旁边)。 .要求 ② 将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值给游客。 .实现提示 ③ (1)第一问实际是最短路径问题,如果有几条路径长度相同,可选择途径景点较少的路径提供给游客。 (2)第二问可采用深度优先搜索,如果有多种路径可选择,则选择带权路径最小的路线提供给游客。 .选做内容 ④ 可以把各种路径都显示给游客,由游客自己选择游览路线。数据结构实验报告 班级:06软件工程 姓名:周邓雄 学号:06517037 摘要:随着经济的发展,人民生活的改善。农业旅游近年来成为旅游的热门选择,本文结合世界农业旅游的发展,依据我国具体国情浅谈我国农业旅游的发展面临的主要问题,并做了相应的对策研究。 关键词:农业旅游 规划 管理 一、农业旅游的概念 农业旅游是把农业与旅游业结合在一起,利用农业景观和农村空间吸引游客前来观赏、游览、品尝、休闲、体验、购物的一种新型农业经营形态,即以农、林、牧、副、渔等广泛的农业资源为基础开发旅游产品,并为游客提供特色服务的旅游业的统称,也称观光农业、旅游农业、乡村旅游等。农业旅游主要是为那些不了解农业、不熟悉农村,或者回农村寻根,渴望在节假日到郊外观光、旅游、度假的城市居民服务的,其目标市场主要在城市居民。农业旅游的发展,不仅可以丰富城乡人民的精神生活,优化投资环境等,而且达到了农业生态、经济和社会效益的有机统一。 二、国外农业旅游发展概况 农业旅游作为一项新的旅游项目,已成为世界潮流。它源于欧洲的西班牙,二十世纪六十年代初,有些西班牙农场把自家房屋改造装修为旅馆,接待来自城市的旅游者前往观光度假,被认为是农业旅游的起源。据世界野生动物基金会估计,1988年,发展中国家生态旅游收入为120亿美元,发达国家的收入更要高出几倍,美国约300亿美元、德国约80亿美元。近年来,国外农业旅游又向深层次发展,旅游者不仅“看”而且“干”,由过去欣赏结果,变为参与过程。真正体验农活的“原汁原味”。如一些旅行社,利用假期,组织城市游客到农村和农民共同生活、学习插秧和采茶,体验耕种和收获,分享农家乐的“插秧割稻旅行”或“采茶旅行”。在收获的季节,旅行社会选出一小包稻米或茶叶给游客寄去,让大家亲口尝一下自己的劳动果实。如今,在一些国家或地区如日本、瑞士、台湾等出现了更高级的农业旅游形式:租地自种。城里人在乡下租一块“自由地”,假日里,偕妻带子,呼朋唤友,到乡下的“自家地里”翻土耕种,施肥浇水,平时则由农场主负责照看农园。这种浅尝辄止的劳作和藕断丝连的乡村情怀,为忙碌和烦躁的城市生活平添了许多雅趣。下面介绍几个国家农业旅游的研究与实践情况: 1、法国 七十年代法国兴起了城市居民兴建“第二住宅”,开辟人工菜园的活动,各地农民适应这一需求,纷纷推出农庄旅游,并组建了全国性的联合经营组织。近年,法国人推出新兴的“农庄旅游”业,全国有1.6万户农家建立起了家庭旅馆。3000多家农民还组成了一个联合经营组织,取名为“欢迎您到农庄来”,吸引了众多的游客。这种新兴的“绿色度假”旅游活动方兴未艾,每年可以给法国农民带来700亿法郎的收益,相当于全国旅游业收入的1/4。 2、美国 每年参加农业旅游的人数达到二千万人次,政府还制定了相关法律法规,以保证农业旅游的健康发展。“瓜果塑造”、“庄稼人艺术画”等乡间艺术也颇受游客青睐。最著名的作品是依梵高的名画《向日葵》创作的20英亩的“庄稼画” —向日葵。10多英亩盛开的向日葵组成画中的葵花,蒺麻组成花瓶,大豆为台布,游人可以在飞机或附近高山上领略它的艺术魅力。 3、日本 日本的农业旅游是开展较早的。日本各地观光农业经营者们成立了协会,各地农场结合生产独辟蹊径,用富有诗情画意的田园风光和各种具有特色的服务设施,吸引了大批国内外游客。旅行社开发了丰富多彩的农业旅游产品,组织旅游者春天插秧,秋天收割,捕鱼捞虾,草原放牧,牛棚挤奶。参加者有农牧学研究人员、学生、银行职员、公司白领等,人均消费2.5至4万日元。日本岩水县小井农场是一个具有百余年悠久历史的民间综合性大农场。自1962年起,农场主结合生产经营项目,先后开辟了600余亩观光农园,设有动物农场,可以观赏到各种家畜在自然怀抱中的憨态,又能增加动物学的知识;牧场馆,每天定时挤牛奶表演和定时看奶油的加工过程,观赏之余,可以购买到各种包装精美而新鲜的奶制品;别具一格的农具展览馆,陈设有各式各样新奇古怪的农用机械,有的是现在使用的,有的是已被淘汰的,人们可以藉此了解农业发展历史和农机具知识,农场旁边,是由废机车改装成的列车旅馆,深受怀古思旧和青年人的欢迎。 三、农业旅游的特点 开发农业旅游,要坚持以农业为基础,利用农业、农村资源,兴办休闲旅游事业,然后逐步过渡到旅、农、工、贸综合发展,从而在农村这片广阔的地域上寻找并创造出城市旅游点无法与之媲美的农业旅游景观特色。根据系统设计的指导思想,为了在农业旅游系统中建立不同门类的子系统,从而建设各具特色、内容多样、轻松愉快的不同农业旅游模式,我们就要研究农业旅游的基本特点。一般认为农业旅游具有以下基本特点: 1、农业特性 旅游农业是在农业生产的基础上开发其旅游功能的,旅游农业的引人入胜主要是优美的田园风光。在开发旅游功能的过程中,可能局部地改变原来的农业生产结构,但农业生产仍是旅游农业的主要方面,所以要防止旅游农业的过度开发,避免破坏基本农田保护区等。 2、生态特性 旅游农业的发展的目标之一是调整人和自然,经济发展与生态环境之间的矛盾。旅游农业的兴旺也要得益于宁静优美的生态环境、天然的自然景观以及纯朴的乡村生活方式、民族文化等。因此,在开发建设旅游农业过程中,尽可能不破坏原来的自然生态环境,减少人工作用,促进农业生态系统良性循环。 3、娱乐特性 旅游农业除了具有优美的生态环境外,还应具有一定程度的娱乐性,否则也不能吸引大量的游客。娱乐性主要体现在观光、农业体验、民俗活动和自然探险等富有农村农业和自然风光特色的游乐活动中,而人工游乐设施则适可而止。 四、我国发展农业旅游的现状及问题 农业旅游是利用农业生态环境开展休闲度假的一种新尝试,是农业和生态旅游相结合、相交叉而形成的新兴产业,这种生态旅游资源的开发,在国内总体上尚处于初级阶段,所以其发展必然受到各种条件的制约。1.观光的季节性是农业旅游发展的瓶颈。由于农业具有季节性的特点,观光农业也具有非常鲜明的季节性。这是农业旅游与其它景区景点,尤其是与其它人文景点相比最明显的区别。一般来说春季和秋季是观光农园的黄金旺季,每天可以接待几千人;但是,夏、冬淡季的时候只及旺季的1/3。像采摘节、赏花节前后仅持续十几天甚至几天的时间,这就造成了旅游旺季特别短。游客的数量比较少,旅游收入也就相应减少。因此,如何延长观光时间、随着季节的变换进行项目的变换是观光农业研究的重要课题。,2.缺乏政府的统一规划和有效地宏观管理。目前,大多数地方市级及区县级都没有制定农业旅游的总体规划,也没有明确的管理机构和管理办法,农业旅游的发展基本上还是以乡村和企业自主开发为主,布局不尽合理。虽然有些地区的建设、农林、水利和旅游部门都制定了一些相应的标准来评定景区景点的等级,实施着各自相应的管理办法,但这样又往往形成了多头管理,几个部门都各自做规划,缺乏宏观控制和指。 3.项目论证不完善,区位选择存在失误。考虑到观光农业园的客源、经营、旅游项目等的特点,观光农业应该选择以下四种区位:(1)大中城市的郊区:具备观光农业发展最基本的客源市场——城市游客。(2)特色农业基地:农业基础比较好,有丰富的生产经验,特色鲜明,容易吸引游人。(3)著名旅游景区附近:可以利用景区的客源市场,吸引一部分游客,或者直接将观光农业园纳入旅游景区内,纳入旅游线路中,作为一个景点向游人开放。(4)度假区周围或度假区内,作为度假区的一部分,开展农业度假形式。目前的一些观光农业在区位选择上,没有充分考虑到本地区的情况,做出的区位选择不恰当,使得游客在路上消耗的时间太多,难以在短暂的周末或一天的时间内及时返回。直接导致了项目的失败。 4.旅游景点重复建设、功能雷同。投资者自身缺乏发展规划能力,导致投资决策的明显随意性和开发的盲目性。很多投资者缺乏制定周密的发展规划和市场调研,设置旅游景点往往不相协调,多数功能设计简单、重复。缺乏特色和吸引力,活动内容相似,创新很少,因此。造成投资决策的随意性和开发的盲目性。比如北京市郊区县区位条件优越。有巨大的客源市场,发展观光农业有得天独厚的条件,但是由于各区县缺乏协调。没有从全市整体上进行总体规划,造成各区县问的盲目竞争,门头沟、房山、密云、怀柔、延庆、昌平、平谷、顺义、大兴等郊区区县都争着上观光农业项目,每个区县都有数十个项目,致使许多园区门前冷落,很少有游客光顾,造成很大损失。 5.单纯模仿、缺乏系统的经营管理。有的地区没有把观光农业看作是建立在农业经营基础上的农业与旅游业有机结合的产业,特另9是很多景点的投资者为当地居民,当他们认识到身边的环境资源能作为“摇钱树”的时候,便按照自己的理解单纯模仿别人的模式仓促上马。有不少观光农业区过于依赖非自然农业技术手段,大搞城市化、大兴人工化,使本来应独具特色的这一旅游项目成丁走了样的“四不像”,或搞成非自然的纯外国景观,不重视可持续农业效益,省略了前期的可行性研究和资源评估,以致造成了严重的环境污染,有的甚至破坏了地域的生态农业环境。管理缺乏系统性,管理手段跟不上。 五、我国农业旅游的应对之策 (一)增强政府作用, 完善规制保障 政府作用的充分发挥,是观光农业核心竞争力提升的重要保障。政府应积极协调农业旅游开发经营者,共同开发观光农业资源,传播农业旅游主题品牌和主题文化,提升农业旅游整体形象和品牌价值,打造观光农业的持续竞争优势;政府还应加大对农业旅游产业发展所需基础设施的投入力度,强化招商引资和社会资本的引导,着力克服农业旅游发展的资金短缺问题,化解产业发展瓶颈问题,如交通、环保等制约因素,实现地区农业观光的可持续发展。在农业旅游的运作管理上,积极创新形式,可采取国有国营、国有民营、、民有民营或不同形式的联合经营,遵循谁投资、谁建设、谁受益的原则,做到产权清晰,权责分明;进一步完善市场竞争规则,创造一个良好的竞争环境,维护公平竞争、优胜劣汰,利用市场手段,优化资源配置;进一步健全产业扶持激励政策,加大政府及社会的支持力度,并注重在实际运行中将其真正落到实处。如出台优惠政策,重点扶持和培育观光农业龙头企业,提升观光农业企业的核心竞争力。加快农村土地流转制度等改革,促进观光农业用地的规模流转,以此吸引财力雄厚的大公司、大企业、大开发商的投资建设,打造高品位、多功能、高效益的观光农业精品,进一步提升观光农业的综合效益。 (二)凝炼特色, 打造精品 要因地制宜,讲究特色。农业旅游核心竞争力的培育要立足于各地农业自然资源的特点,要尽量照顾到自身农业资源环境优势,使特色农业资源环境优势转化为现实生产力,发展具有竞争优势的观光农业产品、产业,形成人无我有,人有我优的竞争优势。如果观光农业产品缺乏特色与创新,不能很好地体现地方农业特色和文化内涵,就无法对消费市场形成持久吸引力。一村一品模式是充分利用当地资源优势,因地制宜发展特色支柱产业的一种经营模式和经营理念,值得借鉴与推广;要搞好主题定位,提升产品形象,打造观光农业精品。观光农业定位应体现民族历史性和地域性,体现地域生态农业特色和地域文化特色的有机结合。要根据竞争状况和充分考虑各地自身的文化和农业资源优势,从资源禀赋、资源空间分布、辐射能力等方面进行把脉,结合考虑客源、当地居民和周边旅游城镇对自身形象的认同来确定自身的发展定位,确定在市场上的竞争优势,来创造主题产品形象,并不断地强化品牌形象,形成鲜明的品牌个性,以强化的竞争优势来提升农业旅游产业竞争力,最终赢得客源市场; 要不断加强对消费者消费需求、消费行为、消费心理、消费能力等的跟踪研究,注重产品的改造升级,在宣传、接待、饮食、导游及各种设施的设置上,都要从消费者角度出发,全方位提升产品与服务质量,形成可持续的竞争优势。要根据区位特点与观光农业的特殊性,努力使观光农业向休闲体验、度假阶段发展,加强高品位、高档次、多功能、知识型的休闲观光农业精品建设,努力实现小的特色化、差异化发展,大的综合化、多功能、品牌化发展,构建具有竞争力的区域观光农业产品体系。 (三)健全服务设施, 提升服务水平 服务核心竞争力主要包括服务设施硬件竞争力和服务能力水平软竞争力两个方面。要大力完善基础设施建设,增强硬件竞争力,增强农业旅游的物质条件。既要扩大投入,完善道路、交通、通信等基础服务设施,提升观光农业的外部环境,增强可进入性,也要加强观光农业园区的基础设施、功能设施建设,以更好地满足消费者多元化的消费需求;深化制度建设,优化观光农业发展的制度环境。制度环境会影响观光农业的创新和发展动力,会影响消费者对观光农业所在地的形象评价。要注重健全观光农业发展的相关法规、政策和制度的创新,培育具有市场竞争能力的观光农业经营主体和外部发展环境;大力推进学习型企业建设,着力提升观光农业经营企业的人力资源水平。农业旅游核心竞争力的培育是市场行为,其同样具有生命周期。只有不断加强学习型企业建设,提升农业旅游企业的人力资源水平,才能持续培养和强化自身的核心竞争力;提高农业旅游所在地居民的服务意识,增强观光农业的文化辐射功能。观光农业所在地的人文地理、民风民俗、居民态度等会影响消费者对该观光农业地的印象和评价,消费者满意度与所在地居民的好客度呈正相关。要想方设法提高观光农业所在地居民的服务意识,挖掘并不断深化观光农业的文化内涵,为消费者提供丰富而深刻的精神和文化享受,增强观光农业的文化辐射功能。 参考文献 【1】 丁忠明,孙敬水 我国观光农业发展研究.中国农村经济 2000 【2】 白净夫 核心竞争力:理论与战略问题.学习与探索 2006 【3】 王云才 国际乡村旅游发展的政策经验与借鉴 旅游学刊 2002(04)【4】 王继全 发展观光农业旅游应注意的几个问题 生态经济 2001(06)【5】 李君茹 浅析我国观光农业发展的现状与对策 农村经济 2004(11) 旅游片区开发规划 概述 旅游经济园区是指以园区的管理和发展特点来建设旅游景区的一种模式,既保持了旅游景区的性质,又具备园区的辐射、带动、示范功能。根据产业驱动作用大小不同,可把旅游经济园区建设途径分为旅游产业主导型和生态产业主导型两种。 ◆旅游产业主导型 以当地旅游资源为基础,以开发旅游景区和旅游项目为手段,旅游产业的发展带动生态农业、生态林业和加工业的迅速发展,从而使旅游景区向旅游经济区转变。 ◆生态产业主导型 以当地生态资源为基础,发展生态农业、生态林业和加工业,从而促进旅游业的发展,使旅游景区向旅游经济园区转变。 旅游片区规划面临的问题 无论是现有旅游片区的进一步发展,还是新的旅游片区的开发建设,旅游片区经营管理者都可能面临一些共性的发展问题。 ◆如何进行旅游片区定位? ◆如何塑造旅游片区的主题形象? ◆如何构建有效需求的旅游产品体系? ◆如何针对目标客群进行精准营销? ◆如何获取持续的旅游吸引力? ◆如何构建旅游片区的专业服务系统? ◆如何确立旅游片区的规划结构? 旅游片区发展咨询服务 针对旅游片区发展中存在的问题,我们提供定位-规划-开发-招商-运营-营销策划的全流程服务,如下: 我们提供的咨询内容主要包括: ◆旅游片区开发定位和战略咨询 为旅游片区开发提供战略性谋划,系统探讨“总体定位、市场定位、产品定位、项目设计、开发模式、营销策略、运营策略”等关键问题,明确旅游片区的方向特色,谋求一二级联动开发效益,为旅游片区规划设计和开发运营提供指导。 ◆旅游片区规划设计服务 绘制旅游片区的发展蓝图,提出“发展定位、功能结构、项目建设、产品组织、品牌策划、系统配套、行动计划”等内容在内的系统解决方案,提供发展规划、建设规划、专项设计等旅游规划设计服务,保障开发建设顺利推进和可持续发展。 ◆旅游地产项目开发策划 针对旅游景点地产、旅游商业地产、旅游度假地产、旅游住宅地产等项目,创新性研究“开发定位、主题品牌、客群定位、功能布局、产品组合、商业模式、营销策略”等内容,编制可行性研究报告与项目建议书等,提供商业化操作战术与行动计划,提供旅游房地产项目策划、规划、设计服务。 ◆旅游招商引资项目策划 根据旅游片区规划设计方案和项目开发模式,结合地区经济特色、行业分布现状及产业链条,挖掘园区核心招商诉求,并找出最佳招商点,选择优质招商企业,并提供招商推介方案。 项目研究的理论模型 图 钻石定位模型 图 定位过程图 资料来源:中投顾问第二篇:公园导游图 课程设计任务书
第三篇:某数据结构课程设计公园导游图
第四篇:农业旅游区
第五篇:旅游区规划