自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 N皇后(附回溯模板)

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。即使其中任意两个皇后都不同列、同行和在一条斜线上。本题用回溯法解决,基本思想为采用深度优先遍历策略,遍历过程中对于每个节点做一次判断,如果满足约束条件则继续向下,否则回溯到前置节点。达到最大深度时则可得到其中一种问题的解。回溯模板vector<bool> judge(n);//记录列表void backtrack(int x){ if (x == n) { /

2020-07-20 21:16:24 261

原创 判断图是否为二分图

二分图: 如果能将一个无向图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,那么就将这个图称为二分图。判断二分图: 对于一个顶点大于2的无向图,其所有回路的顶点个数必须为偶数。算法思路: 染色法,记忆化递归。深度优先遍历(或广度优先遍历)所有顶点并保存前一个顶点的状态pre,对于当前顶点cur,如果cur已经染色且与pre的颜色相同则说明这不是无向图。如果cur未被染色,pre为无色则将cur染成红色否则将cur染成与其不同的颜色。遍历正常结束时说明是无

2020-07-18 21:24:46 2784

原创 STL优先队列priority_queue

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。头文件#include <queue>基本操作和普通队列相同常用的像top, pop, push, empty, size等以整型队列为例定义如下:升序队列,小顶堆,越小优先级越高 priority_queue<int, vector<int>, greater<int>&g

2020-07-16 21:59:30 215

原创 快速排序

快速排序:在给定序列中任意选择一个关键字,将改序列分成比关键字大和比关键字小的两部分,再对这两个小序列重复上述操作,最终即可得到整个序列有序。快速排序的关键在于如何将此关键字放在合适的位置,代码如下:int partition(int a[], int low, int high){ int key = a[(low + high) / 2]; swap(a[(low + high) / 2], a[low]); while (low < high) {

2020-07-15 22:37:09 253

原创 二叉搜索树(BST)的查找、插入、删除操作

定义:二叉搜索树又叫二叉排序树或二叉查找树,它是一棵空树或者是具有以下性质的树:1.节点的左子树只包含小于当前节点的数。2.节点的右子树只包含大于当前节点的数。3.所有左子树和右子树自身必须也是二叉搜索树。二叉树搜索树的中序遍历是有序的。二叉树结构体:struct Node{ int data; Node *left; Node *right; Node(int d = 0):data(d), left(NULL), right(NULL) {}};查找操作:Node* Sea

2020-07-14 17:21:47 489

原创 7-23 还原二叉树

题目描述7-23 还原二叉树 (25分)给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。输入格式:输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。输出格式:输出为一个整数,即该二叉树的高度。输入样例:9ABDFGHIECFDHGIBEAC输出样例:5思路:先利用二叉树的前序遍历和后序遍历构造出二叉树,再利用层序遍历统计树的高度。AC代码# include <bi

2020-07-13 22:50:53 1238

原创 关键路径(AOE网)

拓扑排序主要解决一个工程如何顺序解决的问题,但拓扑排序的结果往往不是唯一的,所以有时还会遇到解决工程完成最短时间的问题。对于从一个源点到另一个汇点的所有路径中,路径长度(路径上每个活动持续时间)最长的成为关键路径,即使改变其它路径的上活动的时间也不会影响整个工程的时间。关键路径算法的关键在于求得事件的的最早发生时间etv:顶点v的最早发生时间。事件的最晚发生时间ltv:顶点v的最早发生时间,如果超过就会影响整个工程的时间。活动的最早发生时间ete:弧<v1,v2>的最早发生时间。活动

2020-07-06 21:29:43 1217 2

原创 拓扑排序(深度优先搜索和广度优先搜索实现)

定义:给定n个顶点的有向图G,如果一个排列满足任意一个有向边(v,u),v在该排列中都在u的前面,那么这个排列称为G的拓扑排序。注意:无环图的拓扑排序可能不止一种,有环图不存在拓扑排序。思路:深度优先搜索(或广度优先搜索)整个图,将出度为0的顶点入栈,中途要判断是否会形成环,最后输出栈得到的序列就是该图的一种拓扑排序。代码1(深度优先搜索):vector<vector<int>> edges;//邻接表vector<int> visited;//0为未搜索,1为

2020-07-06 11:18:04 4799 3

原创 最短路径(迪杰斯特拉Dijkstra算法与弗洛伊德floyd算法)

Dijkstra算法形式上与生成最小树的普里姆Prim算法有在形式上有异曲同工之妙,它可以找到有权图的任意顶点到其它所有顶点的最短路径。采用了贪心思想。仅查找某个起点时间复杂度为O(n^2).代码如下:vector<vector<int>> edges; //邻接矩阵int N//顶点数vector<int> shortPath;//储存起点到其所有顶点的最短权值和vector<int> direction;//储存的值为该下标的前驱void

2020-07-02 23:16:10 683

原创 生成最小树(普里姆算法与库鲁斯卡尔算法)

普里姆算法基本思想:以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小树。代码如下:vector<vector<int>> edges;//邻接矩阵int N;//N为顶点数//普里姆算法,从编号为0顶点开始void prim(){ vector<int> index(N, 0);//储存对应顶点的下标,初始化为第一个顶点的下标0 vector<int> lowcost(edges[0]);//表示已加入生成树的顶点到其他顶点之间权值的最

2020-07-01 22:10:34 1219

原创 7-4是否同一棵二叉搜索树(不建树)

什么是二叉搜索树?1.节点的左子树只包含小于当前节点的数。2.节点的右子树只包含大于当前节点的数。3.所有左子树和右子树自身必须也是二叉搜索树。7-4 是否同一棵二叉搜索树 (25分)给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数

2020-06-30 22:55:15 410

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除