AHU 数据结构 最短路径 安大地图版本
一、實(shí)驗(yàn)?zāi)康?#xff1a;
1.掌握?qǐng)D的鄰接矩陣的存儲(chǔ)定義;
2.掌握?qǐng)D的最短路徑(Dijsktra)算法的實(shí)現(xiàn)。????? 。
二、實(shí)驗(yàn)內(nèi)容:
設(shè)計(jì)北京林業(yè)大學(xué)的校園平面圖,所含景點(diǎn)不少于8個(gè)。以圖中頂點(diǎn)表示學(xué)校內(nèi)各景點(diǎn),存放景點(diǎn)的名稱、景點(diǎn)介紹信息等;以邊表示路徑,存放路徑長(zhǎng)度信息。要求將這些信息保存在文件graph.txt中,系統(tǒng)執(zhí)行時(shí)所處理的數(shù)據(jù)要對(duì)此文件分別進(jìn)行讀寫操作。
1.從文件graph.txt中讀取相應(yīng)數(shù)據(jù), 創(chuàng)建一個(gè)圖,使用鄰接矩陣表示圖(算法6.1);
2.景點(diǎn)信息查詢:為來(lái)訪客人提供校園任意景點(diǎn)相關(guān)信息的介紹;
3.問(wèn)路查詢:為來(lái)訪客人提供校園任意兩個(gè)景點(diǎn)之間的一條最短路徑(算法6.10)。
選做內(nèi)容(對(duì)文件進(jìn)行操作,相應(yīng)信息變化后,再次進(jìn)行景點(diǎn)信息查詢和問(wèn)路查詢時(shí)應(yīng)該有所體現(xiàn))
1. 修改一個(gè)已有景點(diǎn)的相關(guān)信息;
2. 增加一個(gè)新景點(diǎn)及其相關(guān)信息;
3. 增加一條新的路徑;
4. 刪除一個(gè)景點(diǎn)及其相關(guān)信息;
5. 刪除一條路徑。
三、實(shí)現(xiàn)提示:
1. 校園道路是雙向通行的,可設(shè)校園平面圖是一個(gè)帶權(quán)的無(wú)向圖,用鄰接矩陣表示此無(wú)向網(wǎng)。
typedef struct{
????? char name[100];
????? char info[10000];
}VertexType; //頂點(diǎn)結(jié)構(gòu)
typedef struct{
????? VertexType vexs[10];
????? int arcs[100][100];//鄰接矩陣
????? int vexnum,arcnum;//頂點(diǎn)個(gè)數(shù),邊的個(gè)數(shù)
}MGraph; //圖結(jié)構(gòu)
2. 將圖的頂點(diǎn)信息和邊的信息用數(shù)據(jù)文件graph.txt存儲(chǔ),數(shù)據(jù)文件格式可以設(shè)置如下形式:
???????????????????????? 圖中頂點(diǎn)數(shù) 邊的數(shù)目
???????????????????????? 景點(diǎn)名稱 景點(diǎn)信息?????
???????????????????????? 始點(diǎn)?? 終點(diǎn)??? 路徑長(zhǎng)度
如可以在文件graph.txt中存儲(chǔ)以下數(shù)據(jù):
8??? 15 女生宿舍? ??有南北兩棟,24層,是北林最漂亮的宿舍樓 小南門????? 經(jīng)由北林主路通往學(xué)校北門,交通便利 …… 正門??????? 主樓??? 80 正門??????? 圖書館? 400 ……
程序運(yùn)行的參考結(jié)果下圖:
實(shí)驗(yàn)?zāi)康?#xff1a;
1.掌握?qǐng)D的鄰接矩陣的存儲(chǔ)定義;
2.掌握?qǐng)D的最短路徑(Dijsktra)算法的實(shí)現(xiàn)。????? 。
實(shí)驗(yàn)內(nèi)容:
設(shè)計(jì)北京林業(yè)大學(xué)的校園平面圖,所含景點(diǎn)不少于8個(gè)。以圖中頂點(diǎn)表示學(xué)校內(nèi)各景點(diǎn),存放景點(diǎn)的名稱、景點(diǎn)介紹信息等;以邊表示路徑,存放路徑長(zhǎng)度信息。要求將這些信息保存在文件graph.txt中,系統(tǒng)執(zhí)行時(shí)所處理的數(shù)據(jù)要對(duì)此文件分別進(jìn)行讀寫操作。
1.從文件graph.txt中讀取相應(yīng)數(shù)據(jù), 創(chuàng)建一個(gè)圖,使用鄰接矩陣表示圖(算法6.1);
2.景點(diǎn)信息查詢:為來(lái)訪客人提供校園任意景點(diǎn)相關(guān)信息的介紹;
3.問(wèn)路查詢:為來(lái)訪客人提供校園任意兩個(gè)景點(diǎn)之間的一條最短路徑(算法6.10)。
選做內(nèi)容(對(duì)文件進(jìn)行操作,相應(yīng)信息變化后,再次進(jìn)行景點(diǎn)信息查詢和問(wèn)路查詢時(shí)應(yīng)該有所體現(xiàn))
1. 修改一個(gè)已有景點(diǎn)的相關(guān)信息;
2. 增加一個(gè)新景點(diǎn)及其相關(guān)信息;
3. 增加一條新的路徑;
4. 刪除一個(gè)景點(diǎn)及其相關(guān)信息;
5. 刪除一條路徑。
實(shí)現(xiàn)提示:
1. 校園道路是雙向通行的,可設(shè)校園平面圖是一個(gè)帶權(quán)的無(wú)向圖,用鄰接矩陣表示此無(wú)向網(wǎng)。
typedef struct{
????? char name[100];
????? char info[10000];
}VertexType; //頂點(diǎn)結(jié)構(gòu)
typedef struct{
????? VertexType vexs[10];
????? int arcs[100][100];//鄰接矩陣
????? int vexnum,arcnum;//頂點(diǎn)個(gè)數(shù),邊的個(gè)數(shù)
}MGraph; //圖結(jié)構(gòu)
2. 將圖的頂點(diǎn)信息和邊的信息用數(shù)據(jù)文件graph.txt存儲(chǔ),數(shù)據(jù)文件格式可以設(shè)置如下形式:
???????????????????????? 圖中頂點(diǎn)數(shù) 邊的數(shù)目
???????????????????????? 景點(diǎn)名稱 景點(diǎn)信息?????
???????????????????????? 始點(diǎn)?? 終點(diǎn)??? 路徑長(zhǎng)度
如可以在文件graph.txt中存儲(chǔ)以下數(shù)據(jù):
8??? 15 女生宿舍? ??有南北兩棟,24層,是北林最漂亮的宿舍樓 小南門????? 經(jīng)由北林主路通往學(xué)校北門,交通便利 …… 正門??????? 主樓??? 80 正門??????? 圖書館? 400 ……
程序運(yùn)行的參考結(jié)果下圖:
?
實(shí)驗(yàn)要求:
(1) 程序要具在一定的健壯性,即當(dāng)輸入數(shù)據(jù)非法時(shí),程序也能適當(dāng)?shù)刈龀龇磻?yīng)。
(2) 程序要添加適當(dāng)?shù)淖⑨?#xff0c;程序的書寫要采用縮進(jìn)格式。
(3) 根據(jù)實(shí)驗(yàn)報(bào)告模板詳細(xì)書寫實(shí)驗(yàn)報(bào)告,在實(shí)驗(yàn)報(bào)告中給出校園平面圖。
(4) 校園平面圖中的校園景點(diǎn)信息保存在文件graph.txt中,上傳實(shí)驗(yàn)報(bào)告和文件graph.txt作為附件到實(shí)驗(yàn)平臺(tái)https://csec.ahu.edu.cn。源程序作為實(shí)驗(yàn)報(bào)告的附錄,實(shí)驗(yàn)報(bào)告命名為:學(xué)號(hào)姓名實(shí)驗(yàn)項(xiàng)目6.doc,如E2170814101薛力實(shí)驗(yàn)項(xiàng)目6.doc。
四、實(shí)驗(yàn)步驟與過(guò)程:
源代碼:
Graph.h
#pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#define MAXINT 65537#define MVNum 100#define MAX 100typedef char VerTexType;typedef int? ArcType;typedef struct {VerTexType vexs[MVNum];//頂點(diǎn)表ArcType??? arcs[MVNum][MVNum];//鄰接矩陣int vexnum;//圖的頂點(diǎn)數(shù)int arcnum;//圖的邊數(shù)}AMGraph;typedef struct {int* base;int* top;int stacksize;}SqStack;int CreateUDN(AMGraph& G);int LocateVex(AMGraph G,char v1);void ShortPath_DIJ(AMGraph G, int v0, int end);void InitStack(SqStack& S);int Push(SqStack& S, int e);int Pop(SqStack& S, int& e);int GetTop(SqStack S);void menu(int &start, int &end);Graph.cpp
#include "Graph.h"void InitStack(SqStack& S) {S.base = new int[MAX];if (!S.base) return;S.top = S.base;S.stacksize = MAX;return;}int Push(SqStack& S, int e) {if (S.top - S.base == S.stacksize) return -1;*S.top++ = e;return 1;}int Pop(SqStack& S, int& e) {if (S.top == S.base)? return -1;e = *--S.top;return 1;}int GetTop(SqStack S) {if (S.base != S.top)return *(S.top - 1);}//根據(jù)頂點(diǎn)信息,在圖中查找該頂點(diǎn)的位置int LocateVex(AMGraph G, char v1) {int i = 0;for (i = 0; i < G.vexnum; i++) {if (G.vexs[i] == v1)return i;}return -1;}//采用鄰接矩陣表示法,創(chuàng)建有向網(wǎng)int CreateUDN(AMGraph& G) {int i = 0;int j = 0;int k = 0;int v1 = 0;int v2 = 0;int w = 0;int x = 0;int y = 0;printf("請(qǐng)輸入總頂點(diǎn)數(shù):");scanf("%d", &G.vexnum);printf("請(qǐng)輸入總邊數(shù):");scanf("%d", &G.arcnum);//讀入總頂點(diǎn)數(shù),和總邊數(shù)信息for (i = 0; i < G.arcnum; ++i) {for (j = 0; j < G.arcnum; ++j) {G.arcs[i][j] = MAXINT;}}//初始化鄰接矩陣,將邊的權(quán)值設(shè)置成極大值MaxIntprintf("依次輸入頂點(diǎn)的信息:\n");for (i = 0; i < G.vexnum; ++i) {printf("輸入頂點(diǎn)V%d的信息: ",i);scanf("%d", &G.vexs[i]);printf("\n");}//依次輸入頂點(diǎn)的信息for ( k= 0; k < G.arcnum; ++k) {printf("請(qǐng)輸入第%d個(gè)邊的權(quán)值以及它兩端的頂點(diǎn):\n", k + 1);printf("第%d個(gè)邊的權(quán)值:", k + 1);scanf("%d", &w);printf("\n第%d個(gè)邊的出度頂點(diǎn):",k+1);scanf("%d", &v1);printf("\n第%d個(gè)邊的入度頂點(diǎn):", k + 1);scanf("%d",&v2);x = LocateVex(G, v1);//找出頂點(diǎn)v1的位置y = LocateVex(G, v2);//找出頂點(diǎn)v2的位置G.arcs[x][y] = w;//將有向鄰接矩陣中<v1,v2>置為權(quán)值w}return 1;}//用Dijkstra算法求出無(wú)向網(wǎng)的v0頂點(diǎn)到其余頂點(diǎn)的最短路徑void ShortPath_DIJ(AMGraph G, int start, int end) {int i = 0;int w = 0;int n = G.vexnum;//n記錄圖中頂點(diǎn)的個(gè)數(shù)int m = G.arcnum;int v = 0;int* S = new int[n];int* D = new int[n];int* Path = new int[n];int flag = 1;SqStack SQ;InitStack(SQ);for (v = 0; v < n; ++v) {S[v] = 0;//將S集合初始化為空集D[v] = G.arcs[start][v];//將v0到各個(gè)終點(diǎn)的最短路徑長(zhǎng)度初始化為弧上的權(quán)值if (D[v] < MAXINT)Path[v] = start;//如果v0和v之間有弧,則將v的前驅(qū)置為v0elsePath[v] = -1;//如果v0和v之間無(wú)弧,則將v的前驅(qū)置為-1}S[start] = 1;//將v0加入SD[start] = 0;//源點(diǎn)到源點(diǎn)的距離為零//-------------------初始化結(jié)束--------------------------//for (i = 1; i < n; i++) {int min = MAXINT;for (w = 0; w < n; w++) {if (!S[w] && D[w] < min) {v = w;min = D[w];}//選擇當(dāng)前最短路徑,終點(diǎn)為v}S[v] = 1;//將v加入到Sfor (w = 0; w < n; w++) {if (!S[w] && (D[v] + G.arcs[v][w] < D[w])) {D[w] = D[v] + G.arcs[v][w];//更新D[W]Path[w] = v;//更改w的前驅(qū)為v}}}//-------------------輸出結(jié)果--------------------------//printf("從V%d出發(fā),到達(dá)終點(diǎn)V%d的路徑為:\n", start,end);for (i = end; i > 0; i = Path[i]) {Push(SQ, i);}printf("V%d", start);while (1) {flag=Pop(SQ, i);if (flag == -1)break;printf("——>V%d", i);}printf("\n總路徑長(zhǎng)度是%d米",D[end]);}void menu(int &start,int &end) {int Option = 1;while (Option) {printf("----------安徽大學(xué)(磬苑校區(qū))部分地圖最短路徑-----------\n");printf("----------v0 安徽大學(xué)西門??????? v1 桔園餐廳------------\n");printf("----------v2 安徽大學(xué)惠園??????? v3 理工樓C座------------\n");printf("----------v4 南體育場(chǎng)??????????? v5 安徽大學(xué)槐園 --------\n");printf("----------v6 篤行南樓??????????? v7 安徽大學(xué)梅園---------\n");printf("---- V0??? V1??? V2??? V3??? V4??? V5??? V6??? V7? ----\n");printf("-V0? 0??? 334??? MAX?? MAX?? MAX?? MAX?? MAX?? MAX ----\n");printf("-------------------------------------------------------\n");printf("-V1 MAX??? 0???? 746?? 546?? MAX?? MAX?? MAX?? MAX ----\n");printf("-------------------------------------------------------\n");printf("-V2 MAX?? MAX???? 0??? 267?? MAX?? MAX?? MAX?? MAX ----\n");printf("-------------------------------------------------------\n");printf("-V3 MAX?? MAX??? MAX??? 0??? 1133? MAX?? 800?? MAX ----\n");printf("-------------------------------------------------------\n");printf("-V4 MAX?? MAX??? MAX?? MAX?? 0???? 320?? MAX?? MAX ----\n");printf("-------------------------------------------------------\n");printf("-V5 MAX?? MAX??? MAX?? MAX?? MAX??? 0??? 248?? MAX ----\n");printf("-------------------------------------------------------\n");printf("-V6 MAX?? MAX??? MAX?? MAX?? MAX?? MAX?? ?0??? 234 ----\n");printf("-------------------------------------------------------\n");printf("-V7 294?? MAX??? MAX?? MAX?? MAX?? MAX?? MAX??? 0? ----\n");printf("-------------------------------------------------------\n");printf("------------------共計(jì)8個(gè)頂點(diǎn),10條邊-------------------\n");printf("-------------------------------------------------------\n");printf("\n請(qǐng)輸入您當(dāng)前在的位置(用Vk中的下標(biāo)k表示):");scanf("%d", &start);printf("\n請(qǐng)輸入您想去的位置(用Vk中的下標(biāo)k表示):");scanf("%d", &end);if (((start >= 0) && (start <= 7)) && ((end >= 0) && (end <= 7)))Option = 0;elseprintf("請(qǐng)重新輸入!");}}Test.cpp
#include "Graph.h"int main() {AMGraph G;int start = 0;int end = 0;menu(start, end);CreateUDN(G);ShortPath_DIJ(G, start, end);return 0;}五、實(shí)驗(yàn)測(cè)試數(shù)據(jù)與實(shí)驗(yàn)結(jié)果
運(yùn)行結(jié)果:
?
?
六、實(shí)驗(yàn)小結(jié)與體會(huì)
通過(guò)本次課程設(shè)計(jì),對(duì)圖的概念又有了一個(gè)新的認(rèn)識(shí),在學(xué)習(xí)離散數(shù)學(xué)的時(shí)候,總覺(jué)得圖是很抽象的都系,但是在學(xué)習(xí)了《數(shù)據(jù)結(jié)構(gòu)》之后,我慢慢地體會(huì)到了其中地奧妙,圖能夠在計(jì)算機(jī)中存在,首先要捕捉它有哪些具體化、數(shù)字化的信息,比如說(shuō)權(quán)值,頂點(diǎn)個(gè)數(shù)等,這也就說(shuō)明了想要把生活中的信息轉(zhuǎn)化到計(jì)算機(jī)中必須用數(shù)字來(lái)完整的構(gòu)成一個(gè)信息庫(kù),而圖的存在,又涉及到頂點(diǎn)之間的聯(lián)系。圖分為有向圖和無(wú)向圖,而無(wú)向圖又是有向圖在權(quán)值雙向相等下的一種特例。
對(duì)于整個(gè)程序而言,Dijkatra算法始終是核心,思想并不難,難點(diǎn)在于用代碼實(shí)現(xiàn),這次做了安徽大學(xué)部分地點(diǎn)的有向圖最短路徑,希望以后有機(jī)會(huì)能夠完善為完整的地圖,供給大家使用。加油!
總結(jié)
以上是生活随笔為你收集整理的AHU 数据结构 最短路径 安大地图版本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对接顺丰接口
- 下一篇: DHCP配置参数说明