本程序是本人大二课程设计自己写滴,希望对您有帮助!!
课题设计简要任务:
- 构建公园无向图,领接矩阵或邻接表储存;
- 要求求任意两个景点的最短路径;
- 列出入口到出口的路径(路径条数有上限)。
- 要求用文本读入的方式读取数据
目录
一、景点储存与读入
本人用的是邻接表的方式储存数据
struct Head_Node //头节点,纵向
{
string name;
struct Node* First; //指向的第一个Node
Head_Node()
{
name = "";
First = NULL;
}
};
struct Node //横向节点
{
int index;//对应的下标(Head_Node中)
struct Node* next;
double weight;//米
Node()
{
index = 0;
next = NULL;
weight = int(1<<30);
}
};
接下来是Park_guide类的建立
class Park_guide //有权无向图
{
private:
vector<Head_Node> Net;//总网,纵向数组
static int Max_Path;
static int Path_Num;//路径数
int Spot_Num;//景点数
int Side_Num;//边数
int Min_Path[Max_spot][Max_spot];//最短路径的导引数组,用于查任意两点最短路径
double Map[Max_spot][Max_spot]; //对应的邻接矩阵
//double Min_line[100][100];
public:
Park_guide();//初始化地图
~Park_guide();
void Fp_in();//读入文件的函数
int Find(vector<Head_Node> &x, string y);//返回景点y 在Net中的位置(纵向的坐标)
void Inout_ways();//入口和出口的路径
void Inout_Dfs(int temp, int In, int Out, int *arr, int *path);
void Print_line(int In, int Out, int* path);//打印入口出口路线,最大 Max_Path 条
double Weight(int x, int y);//返回以x - y为边的权值
void Per_Min_line();
void Tran_array();
void Two_Mi_line(string de1, string de2);
int Re_Num() { return Max_Path; }//返回最大路径数
};
上图可以方便理解
接下来是文件的读入
首先文件的读入有格式,如下:
n=7
入口 景点1 景点2 景点3 景点4 景点5 出口
v=10
入口 景点1 5
入口 景点3 10
景点1 景点3 8
景点1 景点2 7
景点2 景点5 7
景点5 景点3 6
景点5 景点4 4
景点4 出口 4
景点3 出口 20
景点2 景点4 5
文件名为Test.txt;
n为景点数(包含入口和出口);
v为边数;
第二行要入口为第一个,出口为最后一个;
之间以空格间隔。
下面是函数实现
void Park_guide::Fp_in()
{
ifstream ifs("Test.txt");//定义文件输入流
(ifs).seekg(0);//定位到文件开头
char ch=' ';
string line="";//用于跳行
while (1)
{
ifs.get(ch);
if (ch == 'n') break;
getline(ifs, line);
}
ifs.get(ch);//把等号忽略掉,从等号之后开始读
int n=0;
ifs >> n; //ifs可以与cin一样输入
Spot_Num = n;
//存景点
for (int i = 0; i < n; ++i)
{
Head_Node* s = new Head_Node();
ifs >> s->name;
Net.push_back(*s);
}
ifs.get(ch);//把回车吃掉
ch = ' ';
line = ' ';
while (1)
{
ifs.get(ch);
if (ch == 'v') break;
getline(ifs, line);
}
int v = 0;
ifs.get(ch);
ifs >> v;
Side_Num = v;
//初始化地图
double w;
string s1, s2;
for (int i = 0; i < Side_Num; ++i)
{
Node* x = new Node();
Node* y = new Node();
//边s1,s2对应(x -w- y)
ifs >> s1 >> s2 >> w;
//x为始点,y为末点, 头插法
y->index = Find(Net, s2);
y->weight = w;
y->next = Net[Find(Net, s1)].First;
Net[Find(Net, s1)].First = y;
//y为始点