graph_node.h (邻接链表节点类):
map.h(图类,包括随机生成一个无向图):
map.cpp(实现):
#pragma once
#include "pre_definition.h"
//代表边的节点
class graph_node {
int serial_num;
int weight;//每条边的权值
public:
graph_node* next;
graph_node();
graph_node(int num, int quanzhi);
int get_num();
int get_weight();
void set_num(int n);
void set_weight(int q);
};
graph_node.cpp(实现):
#include "graph_node.h"
#include<iostream>
graph_node::graph_node() {
serial_num = tan90;
weight = tan90;
next = NULL;
}
graph_node::graph_node(int num, int quanzhi) {
serial_num = num;
weight = quanzhi;
next = NULL;
}
int graph_node::get_num() {
return serial_num;
}
int graph_node::get_weight() {
return weight;
}
void graph_node::set_num(int n) {
serial_num = n;
}
void graph_node::set_weight(int q) {
weight = q;
}
point_node.h(图中节点的类):
#pragma once
#include "graph_node.h"
//代表图中点的节点
class point_node {
int data;
public:
bool is_visited;
graph_node* link;
point_node();
point_node(int number);
void set_data(int number);
int get_data();
};
point_node.cpp(实现):
#include "point_node.h"
#include<iostream>
point_node::point_node() {
data = tan90;
is_visited = 0;
link = NULL;
}
point_node::point_node(int number) {
data = number;
is_visited = 0;
link = NULL;
}
void point_node::set_data(int number) {
this->data = number;
}
int point_node::get_data() {
return data;
}
map.h(图类,包括随机生成一个无向图):
#pragma once
#include"point_node.h"
#include <queue>
using namespace std;
class map {
point_node* points;
queue<int> pn_q;
int map_size;
int **link_matrix;//邻接矩阵
//----------------------------------深度优先遍历迭代函数------------------------------------
void deep_first_searching(int i);
//----------------------------------广度优先遍历迭代函数------------------------------------
void breadth_first_searching(int i);
//----------------------------------Dijkstra接口函数----------------------------
void Dijkstra();
public:
map();
~map();
//将当前map的邻接链表改成矩阵的形式存储
void to_matrix();
//输出矩阵
void print_matrix();
//随机生成节点
void random_form();
//建立i->serial_num的有向连接
void my_append_link(int i, int serial_num, int weight);
//随机生成有向图------这个太蠢
void random_link();
//随机生成有向图,邻接表按顺序来的,这个才对
void random_link_order();
//输出
void print_map();
//依照指针删除某个边节点(i点连接到gn指向的节点的边)
void delete_edge(int i, graph_node* gn);
//依照数值删除某个边节点(删除从i到seri_num的边)
void delete_edge(int i, int seri_num);
//清理多余连接线使之成为单边有向图
void clear_map();
//删除该图
void kill_curr_map();
//清除所有is_visited标志位
void refresh();
//---------------------------------接口函数---------------------------------------
//参数接受类型为DFS_way和BFS_way以及Dijkstra_way
void search(int type);
//---------------------------------接口函数完毕-----------------------------------
//***********************迪杰斯特拉算法使用的私有变量及函数**********************
//***********************迪杰斯特拉算法使用的私有变量及函数**********************
//***********************迪杰斯特拉算法使用的私有变量及函数**********************
//***********************迪杰斯特拉算法使用的私有变量及函数**********************
//***********************迪杰斯特拉算法使用的私有变量及函数**********************
private:
int source;
int ** S_set;//已经找出最短路径的节点集合,S_set[i]这一行存的是从源节点到i这个点所需经过的点的序号
//数据为-1511291时表示后面没有路了,当首个数据为-1511291时表示该行不在这个集合中
int ** U_set;//待迭代的节点集合
int *cost; //cost[i]存放从 source到i的最小代价值
//移除一个set中的hang行,即移除某set中以hang为终点的路
void remove(int **set, int hang);
//从from_set复制hang行给to_set
void copy(int **from_set, int **to_set, int from_hang, int to_hang);
//在set中的hang行最后加一个点i
void add(int **set, int hang, int i);
//从U向S移动某行,即移动某个点的路径
void move_U2S(int hang);
//判断i这个行是否在集合set内
bool is_in(int **set, int i);
//求a数组中,不在集合S的元素的最小值的编号
int min_not_in_S(int *a);
//判断一个数字是否存在(跟-1511291比较)
bool is_exist(int num);
//判断一个数字是否无穷大(跟1511291比较)
bool is_infinite(int num);
public:
void initiate_dijkstra();
//寻找最短路径函数
void find_way(int s);
//输出S_set,用于debug
void print_S_set();
//输出U_set,用于debug
void print_U_set();
//输出cost表,用于debug
void print_cost();
//用于表示最终结果的函数
void show_result();
};
map.cpp(实现):
#include "map.h"
#include <time.h>
#include <iomanip>
#include <iostream>
using namespace std;
//构造函数
map::map() {
points = NULL;
map_size = 0;
link_matrix = NULL;
srand((unsigned)time(NULL));
}
//析构函数
map::~map() {
delete points;
}
//----------------------------------深度