数据结构
乔梦圆的博客
这个作者很懒,什么都没留下…
展开
-
L2-001 紧急救援 天梯赛(25 分C++)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。输入格式:输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,原创 2022-04-10 16:48:48 · 855 阅读 · 0 评论 -
L2-004 这是二叉搜索树吗? (25 分) (PTA C++代码)
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出格式:如果输入序列是对一棵二叉搜索树或其镜像进原创 2022-02-24 20:09:48 · 554 阅读 · 0 评论 -
求树的层序遍历(已知后序和中序遍历)
要求:给定后序和中序遍历序列,输出对应二叉树的层序遍历序列。输入规格:第一行给出一个正整数N (≤30),表示二叉树中的节点总数。第二行给出后序序列,第三行给出中序序列。一行中的所有数字都用空格分隔。输出规格:在一行中打印相应二叉树的层序遍历序列。一行中的所有数字必须正好用一个空格隔开,行尾不得有多余的空格。例如:样本输入:72 3 1 5 7 6 41 2 3 4 5 6 7示例输出:4 1 6 3 5 7 2#include <bits/stdc++.h>using原创 2021-11-09 22:56:01 · 463 阅读 · 0 评论 -
7-4 字符串模式匹配(pta)
给定主串s和模式串p,编写程序输出p在s中出现的首位置,若p不在s中则输出-1。字符串下标从0开始。输入格式:输入为2行,第1行主串s,第2行为模式串p。主串和模式串长度不超过100000。输出格式:输出为2行,第1行为若干整数,表示模式串p的失败函数值,每个整数后一个空格;第2行为一个整数,表示p在s中出现的首位置,若p不在s中则输出-1。输入样例:在这里给出一组输入。例如:qwerabcabhlkabcab结尾无空行输出样例:在这里给出相应的输出。例如:-1 -1 -1 0 1原创 2021-09-16 20:32:44 · 4809 阅读 · 0 评论 -
交通规划(csp最详细题解100分代码---最小最短路径树)
问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统。 建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成高速铁路。现在,请你为G国国王提供一个方案,将现有的一部分铁路改造成高速铁路,使得任何两个城市间都可以通过高速铁路到达,而且从所有城市乘坐高速铁路到首都的最短路程和原来一样长。请你告诉G国国王在这些条件下最少要改造多长的铁路。输入格式 输入的第一行包含两个整数n, m,分别表示G国城市的数量和城市间铁路的数原创 2021-08-26 23:08:19 · 1128 阅读 · 3 评论 -
spfa算法求最短路(简化版)
1、最短路径问题介绍问题解释:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径解决问题的算法:[迪杰斯特拉算法(Dijkstra算法)](https://blog.csdn.net/q1430186623/article/details/117400132)[弗洛伊德算法(Floyd算法)](https://blog.csdn.net/q1430186623/article/details/117400444)SPFA算法之前已经对Dijkstra算法和F转载 2021-08-24 22:43:31 · 350 阅读 · 0 评论 -
送货(欧拉回路)(csp100分代码)
在这道题之前我们先讲一下欧拉通路和欧拉回路的概念。如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉通路(Euler path)。如果一个回路是欧拉通路,则称为欧拉回路(Euler circuit)。具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉通路但不具有欧拉回路的图称为半欧拉图**。先说说欧拉回路的判断(由于本题中不用欧拉回路,所以了解即可):无向图存在欧拉回路的充要条件:一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。有向图存在欧拉回路的充要条件:一个原创 2021-08-20 15:52:30 · 316 阅读 · 0 评论 -
克鲁斯卡尔算法求最小生成树(简易算法版)
克鲁斯卡尔算法的思想并不难,难的是算法的实现,它的算法里用到了并查集的思想,关于并查集算法这里就不专门细说了,感兴趣的读者可以自行百度。克鲁斯卡尔算法的思想:先把所有的边的长度从小到大排好序,然后依次加到最小生成树里,加的时候如果遇到回路就跳过(最小生成数不能有回路),直到加到N-1条为止(N为顶点数,因为最小生成树的边数一定是N-1条),所构建的即为最小生成树。#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f原创 2021-05-31 15:44:10 · 426 阅读 · 0 评论 -
普里姆算法求最小生成树(简易算法版)
普里姆算法求最小生成树与之前发的迪杰斯特拉算法求最小生成树的思想类似,都是用到一个dis数组,不过与迪杰斯特拉算法不同的是,之前迪杰斯特拉算法求最短路里dis存储的是源点到各点的最短路,每次循环找离源点最近的点,确认后加入到已知最短路的集合中,并标记。然后根据这个最近的点松弛离源点最近的点的距离,而这里对dis进行松弛的时候,只需要判断与找到的最近点相连的点的距离<初始源点到这个点的直接距离然后松弛就行,其余的跟迪杰斯特拉算法几乎一样。我们会注意到这里为什么不用像迪杰斯特拉算法一样加上之前的距离进行原创 2021-05-31 15:05:06 · 1019 阅读 · 0 评论 -
弗洛伊德算法求任意两点最短路(简易算法版)
弗洛伊德算法思想:矩阵D存储任意两点间的最短路径,刚开始矩阵D和邻接矩阵一样,利用弗洛伊德算法实现时,依次枚举N个中转点(N为所有顶点数),判断如果从第i个点出发到第j个点,如果:起点i到中转点k的距离+k到终点j的距离比它两的直接距离还小,那么就更新矩阵D中它两对应的值。#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3fint D[100][100],N,M,G[100][100]; //D为任意两点最短原创 2021-05-30 17:06:10 · 1017 阅读 · 1 评论 -
迪杰斯特拉算法求最短路(简易算法版)
迪杰斯特拉算法适用于单源点求最短路的情况,即求一个点到其他点最短距离。它的思想与普里姆算法求最小生成树类似。迪杰斯特拉算法思想:用一个dis数组存放各个点到源点的距离,每次循环找离源点最近的点,确认后加入到已知最短路的集合中,并标记(下次再找离源点最近的点的时候,被标记的点就直接跳过了,因为它已经在最短路里了),然后根据找到的这个最近的点进行延伸,分析与它相连的点,如果初始源点到最近点的距离+与它相连的这个点的距离<初始源点到这个点的直接距离,那么就松弛它。(松弛:意思就是更新原来dis数组里原创 2021-05-30 16:54:34 · 352 阅读 · 0 评论 -
任意两点最短路径(floyd和dijstra算法+dfs搜索)
图是数据结构中很重要的一部分内容,这里我给出了在图的相关应用中最常见的几个算法实现。1.dfs搜索所有节点。2.求两点间的最短路径(dijstra算法)3.求两点间的最短路径(flyod算法)#include <iostream>#include <stdio.h>using namespace std;#define MAXVEX 100#define INFI 0x3f3f3ftypedef int VexType;typedef int EdgType;i原创 2021-04-22 21:16:38 · 835 阅读 · 0 评论 -
几种常见排序算法的实现(C语言实现)
这里我给大家做了4种排序算法的实现,分别是:冒泡排序、选择排序、直接插入排序、快速排序。其中冒泡和选择是用链式结构来实现的,因此我这里先定义了链表的基本结构和创建操作。#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct LNode //定义链表类型{ ElemType data; //数据域 struct LNode *next; //指针域 }LNode,*Li原创 2021-04-18 21:40:28 · 404 阅读 · 0 评论 -
完全二叉树的权值(2019蓝桥杯第七题)
【问题描述】给定一棵包含N个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是A1,A2,AN,如下图所示:现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是1。【输入格式】第一行包含一个整数N。第二行包含N个整数A1,A2,AN。【输出格式】输出一个整数代表答案。【样例输入】71 6 5 4 3 2 1【样例输出】2思路:用一个数组存储输入的各个节点值原创 2021-04-15 17:59:37 · 377 阅读 · 0 评论 -
7-11 玩转二叉树
7-11 玩转二叉树给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:71 2 3 4 5 6 74 1 3 2 6 5 7输原创 2021-04-09 17:17:08 · 544 阅读 · 0 评论 -
7-14 小字辈
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。输出格式:首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。输入样例:原创 2021-03-30 23:31:40 · 197 阅读 · 0 评论 -
7-13 分而治之
分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。输入格式:输入在第一行给出两个正整数 N 和 M(均不超过10 000),分别为敌方城市个数(于是默认城市从 1 到 N 编号)和连接两城市的通路条数。随后 M 行,每行给出一条通路所连接的两个城市的编号,其间以一个空格分隔。在城市信息之后给出参谋部的系列方案,即一个正整数 K (≤ 100)和随后的 K原创 2021-03-30 13:43:29 · 735 阅读 · 0 评论 -
实现给定数组的快速排序
快速排序是众多排序方法中的很重要的一种方法,如它的名字一样,它的特点就是快,时间复杂度仅为O(nlogn)。快速排序的算法思想:先确定一个枢轴(一般为第一个元素),然后两个下标i和j分别指向这组元素的头和尾,下标j从后往前走,每当找到一个比枢轴元素小的,当前元素就与枢轴元素交换位置,然后下标i开始从前往后走,每当找到一个比枢轴元素大的,当前元素就与枢轴元素交换位置,然后下标j继续往前走,执行相应操作。总之,j走一次,i走一次(这里的一次指的是 :走到可以交换的位置停下来算一次),注意刚开始一定是先从后原创 2021-02-01 14:24:39 · 1720 阅读 · 0 评论 -
7-7 约瑟夫环
N个人围成一圈顺序编号,从1号开始按1、2、3…顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号。输入格式:输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。输出格式:按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。输入样例:在这里给出一组输入。例如:7 3输出样例:3 6 2 7 5 1 4思路:借用链表方便插入删除的特点实现原创 2021-01-25 15:56:16 · 655 阅读 · 0 评论 -
求两点间最短路径
#include <iostream>using namespace std;#define MAXVEX 100#define INFI 0x3f3f3ftypedef int VexType;typedef int EdgType;int visited[MAXVEX];int D[MAXVEX][MAXVEX]; //存储最短路径长度 int P[MAXVEX][MAXVEX]; //存储最短路径 typedef struct{ VexType Vexs[MAXVEX]原创 2021-01-14 20:38:02 · 872 阅读 · 0 评论 -
求最小生成树
#include <iostream>using namespace std;#define MAXEDGE 14#define MAXVEX 9int ShortPath=0; typedef struct { int begin; int end; int weight; }Edge; //边表结构 Edge edges[MAXEDGE]; typedef struct{ int Vexnum; int Edgnum; }MGraph; //图 int原创 2021-01-14 20:36:01 · 81 阅读 · 0 评论 -
图的邻接矩阵及图的广度遍历
#include <iostream>#include <stdlib.h>using namespace std;typedef int VexType;typedef int EdgeType;#define INFI -1 //无穷大表示不存在 #define MAX_VALUE 100int visited[MAX_VALUE]; //访问标志的数组 typedef struct{ VexType vexs[MAX_VALUE]; //顶点表 Ed原创 2021-01-14 20:34:28 · 143 阅读 · 0 评论 -
赫夫曼树及赫夫曼编码、译码的算法实现
赫夫曼树及赫夫曼编码是数据结构与算法中的一个重要知识点,在生活中也是应用广泛,现在我来教大家如何构建一颗赫夫曼树并且实现它的赫夫曼编码。先讲解思路,后面会附完整代码及运行效果图。构建赫夫曼树的算法思路如下1.输入一串字符,统计出每个字符的出现频度创建字符频度表。typedef struct //字符频度表 { int weight; //权值 char c; //对应字符 }F_W;F_W w[100];//字符频度存放数组int char_count(string s,char a)原创 2020-11-05 23:30:50 · 3243 阅读 · 5 评论 -
二叉树的基本遍历操作(层次、先序、中序、后序)
二叉树是数据结构中很重要的一个知识点,所以掌握二叉树的基本操作对我们以后的学习是有非常大的帮助的。要求:掌握二叉树的先序、中序、后序、层次遍历的方法。树的建立时:输入树的节点数据,当输入为空格时证明无节点数据下面来看基本建立和三种顺序遍历操作代码int CreateBiTree(BiTree &T) //前序创建树 { char ch; scanf("%c",&ch);//输入一个字符 if(ch==' ') //如果输出为空格证明为空节点 {T=NULL;原创 2020-10-23 23:39:49 · 1093 阅读 · 0 评论 -
判断回文(栈的应用)
在生活中我们称正读和反读都相同的字符序列为“回文”,例如,’abba’和’abcba’是回文,’abcde’和’ababab’则不是回文。下面我们来编写一个程序来判断一个字符串是不是回文,这次我们用数据结构中的栈来实现。下面是c语言代码实现。#include <stdio.h>#include <stdlib.h> typedef char ElemType;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typed原创 2020-10-11 19:30:10 · 2109 阅读 · 0 评论 -
进制的转换(栈的应用)
将十进制数N和其他d进制数之间进行转换是计算机实现计算的基本问题,解决方案很多,其中最简单的方法是除d取余法。例如,(1348)10=(2504)8,其转化过程如下所示:N N div 8 N mod 81348 168 4168 21 021 2 52 0原创 2020-10-09 22:08:14 · 3828 阅读 · 2 评论 -
简单四则运算表达式求值(栈的应用)
要求从键盘输入一个算术表达式并输出它的结果,算术表达式可包含加、减、乘、除、十进制整数和小括号,利用栈实现。首先我们需要定义两个栈的基本创建插入删除操作数据栈:存放数据操作符栈:存放操作符#include <stdio.h>#include <stdlib.h> typedef int ElemType;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct //定义数据栈(存放数据)原创 2020-10-09 16:14:31 · 2132 阅读 · 3 评论 -
c语言顺序表的基本操作
众所周知,顺序表是数据结构中线性表的知识,线性表有两种存储结构,一种是顺序存储(顺序表),一种是链式存储(链表)。现在给出顺序表中常用基本操作的c语言代码实现。#include <stdio.h>#include <stdlib.h>#define Maxsize 20typedef int ElemType;typedef struct{ ElemType *data; //定义数组 int lenth; //线性表当前长度 }SqList;vo原创 2020-09-22 23:20:03 · 448 阅读 · 0 评论 -
c语言链表的基本操作
众所周知,顺序表是数据结构中线性表的知识,线性表有两种存储结构,一种是顺序存储(顺序表),一种是链式存储(链表)。现在给出顺序表中常用基本操作的c语言代码实现。#include <stdio.h>#include <stdlib.h>#define Maxsize 20typedef int ElemType;typedef struct{ ElemType *data; //定义数组 int lenth; //线性表当前长度 }SqList;vo原创 2020-09-22 23:07:15 · 1077 阅读 · 0 评论 -
PTA天梯赛-二叉搜索树的2层结点统计
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。将一系列数字按给定顺序插入一棵初始为空的二叉搜索树,你的任务是统计结果树中最下面 2 层的结点数。输入格式:输入在第一行给出一个正整数 N (≤1000),为插入数字的个数。第二行给出 N 个 [−1000,1000] 区间内的整数。数字间以空格分隔。输出格式:在一行中输出最下面 2 层原创 2020-11-26 23:35:35 · 1315 阅读 · 4 评论