//main.cpp
#include
#include "Tourism.h";
#include "Graph.h"
struct Graph m_Graph;
using namespace std;
void show_menu() {
cout << "=====景区信息管理系统=====" << endl;
cout << "1.创建景区景点图" << endl;
cout << "2.查询景点信息" << endl;
cout << "3.旅游景点导肮" << endl;
cout << "4.搜索最短路径" << endl;
cout << "5.铺设电路规划" << endl;
cout << "0.退出" << endl;
cout << "请输入操作编号(0~5):";
}
int main() {
char option[20];
while (true) {
system("pause");
system("cls");
show_menu();
cin >> option;
if (strcmp(option, "1") == 0) {
CreateGraph();
}
else if (strcmp(option, "2") == 0) {
GetSpotInfo();
}
else if (strcmp(option, "3") == 0) {
TravelPath();
}
else if (strcmp(option, "4") == 0) {
FindShortPath();
}
else if (strcmp(option, "5") == 0) {
DesignPath();
}
else if (strcmp(option, "0") == 0) {
break;
}
}
return 0;
}
//Graph.cpp
#include
#include
#include "Graph.h"
#include "Tourism.h"
extern struct Graph m_Graph;
using namespace std;
void Init(void) {
m_Graph.m_nVexNum = 0;
for (int i = 0; i < 20; i++) {
strcpy(m_Graph.m_aVexs[i].name, "");
strcpy(m_Graph.m_aVexs[i].desc, "");
m_Graph.m_aVexs[i].num = -1;
for (int j = 0; j < 20; j++) {
if (i == j) m_Graph.m_aAdjMatrix[i][j] = 0;
else m_Graph.m_aAdjMatrix[i][j] = MAX;
}
}
}// 初始化图结构。
void InsertVex(Vex sVex,int i) {
m_Graph.m_aVexs[i].num =sVex.num;
strcpy(m_Graph.m_aVexs[i].name, sVex.name);
strcpy(m_Graph.m_aVexs[i].desc, sVex.desc);
}// 将顶点添加到顶点数组中。
void InsertEdge(Edge sEdge) {
m_Graph.m_aAdjMatrix[sEdge.vex1][sEdge.vex2] = sEdge.weight;
m_Graph.m_aAdjMatrix[sEdge.vex2][sEdge.vex1] = sEdge.weight;
}// 将边保存到邻接矩阵中。
void GetVex(int nVex) {
cout << m_Graph.m_aVexs[nVex].name << endl;
cout << m_Graph.m_aVexs[nVex].desc << endl;
cout << "-----周边景区-----" << endl;
FindEdge(nVex);
}// 查询指定顶点信息。
int FindEdge(int nVex) {
for (int i = 0; i < m_Graph.m_nVexNum; i++) {
if (i != m_Graph.m_aVexs[nVex].num&&m_Graph.m_aAdjMatrix[m_Graph.m_aVexs[nVex].num][i] != MAX) {
cout << m_Graph.m_aVexs[nVex].name << "-" << m_Graph.m_aVexs[i].name << " " << m_Graph.m_aAdjMatrix[m_Graph.m_aVexs[nVex].num][i] << endl;
}
}
return 0;
}// 查询与指定顶点相连的边。
int GetVexnum(void) {
return m_Graph.m_nVexNum;
}// 获取当前顶点数
void DFS(int nVex, bool bVisted[], int &nIndex, PathList &pList) {
bVisted[nVex] = false;
if (nIndex == m_Graph.m_nVexNum - 1) {
pList->next = new Path();
for (int i = 0; i < m_Graph.m_nVexNum - 1; i++) {
pList->next->vexs[i] = pList->vexs[i];
}
pList = pList->next;
pList->next = NULL;
bVisted[nVex] = true;
return;
}
for (int i = 0; i < m_Graph.m_nVexNum; i++) {
if (i == nVex||!bVisted[i]) continue;
if (m_Graph.m_aAdjMatrix[nVex][i] != MAX) {
pList->vexs[nIndex++] = i;
DFS(i, bVisted, nIndex, pList);
nIndex--;
}
}
bVisted[nVex] = true;
}
void DFSTraverse(int nVex, PathList &pList) {
bool bVisted[20];
memset(bVisted, true, sizeof(bVisted));
int nIndex = 0, countn = 0;
PathList temp = pList;
pList->next = NULL;
DFS(nVex, bVisted, nIndex, temp);
while (pList != NULL) {
cout << "路线" << ++countn << ": "<vexs[i] != -1; i++) {
cout << " -> " << m_Graph.m_aVexs[pList->vexs[i]].name;
}
cout << endl;
pList = pList->next;
}
}
int FindShortPath(int nVexStart, int nVexEnd) {
int dp[20][20];
int index = 0,flag=0;
//aPath[index].vex1 = nVexStart;
//aPath[index].vex2 = nVexEnd;
//aPath[index].weight = m_Graph.m_aAdjMatrix[nVexStart][nVexEnd];
int route[20];
memset(route, -1, sizeof(-1));
int Vexnum = GetVexnum();
for (int i = 0; i < Vexnum; i++) dp[0][i] = m_Graph.m_aAdjMatrix[nVexStart][i];
for (int i = 0; i < Vexnum; i++) {
if (i == nVexStart) {
for (int j = 0; j < Vexnum; j++) {
dp[i + 1][j] = dp[i][j];
}
continue;
}
for (int j = 0; j < Vexnum; j++) {
dp[i+1][j] = min(dp[i][j], dp[i][i] + m_Graph.m_aAdjMatrix[i][j]);
}
}
int x = Vexnum ;
int y = nVexEnd;
route[0] = nVexEnd;
while (x) {
if (x == nVexStart) {
x--;
continue;
}
for (int i = 0; i < Vexnum; i++) {
if (dp[x][y] == dp[x - 1][i] + m_Graph.m_aAdjMatrix[i][y]) {
route[++index] = i;
y = i;
if (i == nVexStart) {
x = 1;
break;
}
}
}
x--;
}
int minRoute = 0;
cout << "最短路线为: "<=0; i--) {
minRoute += m_Graph.m_aAdjMatrix[route[i + 1]][route[i]];
cout << "->" << m_Graph.m_aVexs[route[i]].name;
if (route[i] == nVexEnd) break;
}
cout << endl << "最短距离为:" << minRoute << endl;
return minRoute;
}//通过Dijkstra算法求得v1到v2的最短路径
struct neigbor_egde {
int weight;
int index;
int parent;
neigbor_egde(){}
neigbor_egde(int weight,int index,int parent):weight(weight),index(index),parent(parent){}
};
const bool operator< (neigbor_egde const temp1, neigbor_egde const temp2) {
return temp1.weight > temp2.weight;
}
int FindMinTree() {
priority_queue que;
set V;
V.insert(0);
int index = 0,flag=1;
int num = GetVexnum();
int sumRoute = 0;
while (flag != num) {
for (int i = 0; i < num; i++) {
if (m_Graph.m_aAdjMatrix[index][i] != MAX && i != index) {
neigbor_egde temp(m_Graph.m_aAdjMatrix[index][i], i, index);
que.push(temp);
}
}
while (true) {
neigbor_egde temp = que.top();
que.pop();
if (V.count(temp.index) == 0) {
V.insert(temp.index);
cout << m_Graph.m_aVexs[temp.parent].name << " -> " << m_Graph.m_aVexs[temp.index].name<<" "<
//Graph.h
#pragma once
#ifndef Graph_h
//#define Graph_h
struct Vex
{
int num; // 景点编号
char name[20]; // 景点名字
char desc[1024]; // 景点介绍
Vex(int num,char *name,char *desc) {
this->num = num;
strcpy(this->name, name);
strcpy(this->desc , desc);
}
Vex(){}
};
struct Edge
{
int vex1, vex2; //边的两个个顶点
int weight; //权值
Edge(int vex1, int vex2, int weight) {
this->vex1 = vex1;
this->vex2 = vex2;
this->weight = weight;
}
Edge() {
}
};
struct Graph {
int m_aAdjMatrix[20][20]; // 邻接矩阵
Vex m_aVexs[20]; // 顶点数组
int m_nVexNum; // 顶点个数
}; // Graph对象,用于存储景区景点图
typedef struct Path
{
int vexs[20]; //保存一条路径
Path *next; //下一条路径
Path() {
memset(vexs, -1, sizeof(vexs));
}
}*PathList;
const int MAX = 0x7fffff;
void Init(void);// 初始化图结构。
void InsertVex(Vex sVex,int i);// 将顶点添加到顶点数组中。
void InsertEdge(Edge sEdge);// 将边保存到邻接矩阵中。
void GetVex(int nVex);// 查询指定顶点信息。
int FindEdge(int nVex);// 查询与指定顶点相连的边。
int GetVexnum(void);// 获取当前顶点数
void DFS(int nVex, bool bVisted[], int &nIndex, PathList &pList);
void DFSTraverse(int nVex, PathList &pList);
int FindShortPath(int nVexStart, int nVexEnd);
int FindMinTree();//求最小生成树
#endif
//Tourism.cpp
#include
#include
#include
#include
#include "Graph.h"
#include "Tourism.h"
using namespace std;
extern struct Graph m_Graph;
void CreateGraph(void) {
Init();
int num; // 景点编号
char name[20]; // 景点名字
char desc[1024];//景点描述
ifstream VexR("Vex.txt"), EdgeR("Edge.txt") ;
if (VexR.is_open()) {
VexR >> m_Graph.m_nVexNum;
for (int i = 0; i < m_Graph.m_nVexNum; i++) {
VexR >> num >> name >> desc;
Vex temp(num, name, desc);
InsertVex(temp,i);
}
}
int vex1, vex2; //边的两个个顶点
int weight; //权值
if (EdgeR.is_open()) {
while (!EdgeR.eof()) {
EdgeR >> vex1 >> vex2 >> weight;
Edge temp(vex1, vex2, weight);
InsertEdge(temp);
}
}
return;
}//读取文件,创建景区景点图。
void GetSpotInfo(void) {
cout << "=====查询景点信息=====" << endl;
for (int i = 0; i < m_Graph.m_nVexNum; i++) {
cout << m_Graph.m_aVexs[i].num << "-" << m_Graph.m_aVexs[i].name << endl;
}
cout << "请输入想要查询的景点编号:";
int option;
cin >> option;
GetVex(option);
}// 查询指定景点信息,显示到相邻景点的距离。
void TravelPath() {
cout << "=====旅游景点导航=====" << endl;
for (int i = 0; i < m_Graph.m_nVexNum; i++) {
cout << m_Graph.m_aVexs[i].num << "-" << m_Graph.m_aVexs[i].name << endl;
}
cout << "请输入起始点编号:";
int option;
cin >> option;
cout << "导航路线为:" << endl;
PathList pList=new Path();
DFSTraverse(option, pList);
}//输入起点游览所有景点的路线
void MinRoute(int begin, int end) {
int dp[20];
int route[20];
route[0] = begin;
int index = 1;
memset(route, -1, sizeof(route));
int Vexnum = GetVexnum();
for (int i = 0; i < Vexnum; i++) dp[i] = m_Graph.m_aAdjMatrix[begin][i];
for (int i = 0; i < Vexnum; i++) {
for (int j = 0; j < Vexnum; j++) {
dp[j] = min(dp[j], dp[i] + m_Graph.m_aAdjMatrix[i][j]);
}
}
for (int i = Vexnum - 1; i >= 0; i++) {
if (dp[end] == dp[i] + m_Graph.m_aAdjMatrix[i][end])
route[index++] = i;
}
cout << begin << "(" << m_Graph.m_aVexs[begin].name << ")" << "-" << end << "(" << m_Graph.m_aVexs[end].name << ")" << "最短路径为:" << dp[end] << endl;
/*for (int i = 0; i < index; i++) {
cout << route[i] << "(" << m_Graph.m_aVexs[route[i]].name <<")"<< "-" << route[i+1] << "(" << m_Graph.m_aVexs[route[i+1]].name <<")"<< "路长:" <> nVexStart;
cout << "请输入终点编号: " ;
cin >> nVexEnd;
FindShortPath(nVexStart, nVexEnd);
/*cout << "最短路线为: " ;
for (int i = 0; aPath[i].vex1 != -1; i++) {
minRoute += aPath[i].weight;
if (i != 0) cout << "->" << m_Graph.m_aVexs[aPath[i].vex2].name;
else cout << m_Graph.m_aVexs[aPath[i].vex1].name <<"->" << m_Graph.m_aVexs[aPath[i].vex2].name;
}
cout << "最短距离为:" << minRoute;*/
}//通过调用m_Graph()函数查询两个景点间的最短路径和距离
void DesignPath(void) {
cout << "=====铺设电路规划=====" << endl;
cout << "在以下两个景点之间铺设电路:" << endl;
FindMinTree();
}//电路设计
//Tourism.h
#pragma once
#ifndef Tourism_h
#define Tourism_h
void CreateGraph(void);//读取文件,创建景区景点图。
void GetSpotInfo(void);//查询指定景点信息,显示到相邻景点的距离。
void MinRoute(int begin, int end);//最短路求解
void TravelPath();//输出旅游导航路径
void FindShortPath(void);//查询最短路径
void DesignPath(void);//电路线路设计
#endif