随机生成图,dijkstra算法求最短路径,深度、广度优先历遍【待更新其他算法】

graph_node.h (邻接链表节点类):
#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;
}
//----------------------------------深度
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值