
数据结构
在学习数据结构过程中 的一些经验分享,记录学习过程
StarryTank
这个作者很懒,什么都没留下…
展开
-
Trie树(字典树,前缀树)
用于存储字符串集合S,可以判断字符串是否存在,统计字符串的数量,以及统计以某个字符串为前缀的字符串的个数#include<bits/stdc++.h>#define N 1000010using namespace std;int son[N][26],cnt[N],idx,n,s[N];//用数组模拟树,idx表示节点下标,根结点与空节点下标为0 void insert(string str){ int p=0; for(int i=0;i<str.size();i+原创 2021-12-11 16:18:21 · 284 阅读 · 0 评论 -
模拟堆,堆排序
#include<bits/stdc++.h>#define N 100010using namespace std;int n,a[N]; //下沉 void sift_down(int i){ i=i<<1;//左节点 if(i<=n){ if(i+1<=n&&a[i+1]>a[i]) i++; if(a[i]>a[i>>1]){ swap(a[i],a[i>>1]);//交原创 2021-12-09 19:35:56 · 88 阅读 · 0 评论 -
输出所有的拓扑排序(dfs)
#include<bits/stdc++.h>#define maxn 100#define INF 0x3f3f3fusing namespace std;int m,n,ans[maxn],indegree[maxn],vis[maxn],g[maxn][maxn];void dfs(int depth){ if(m==depth-1){ for(int i=1;i<=m;i++){ cout<<ans[i]<原创 2021-06-19 15:21:21 · 563 阅读 · 0 评论 -
拓扑排序-topSort
#include<bits/stdc++.h>#define maxn 100#define INF 0x3f3f3fusing namespace std;int m,n,indegree[maxn],g[maxn][maxn],cnt;vector<int>ans;void topSort(){ stack<int>s; for(int i=1;i<=m;i++){//将入度为0的顶点入栈 if(indegree[i]原创 2021-06-19 15:09:16 · 123 阅读 · 0 评论 -
最小生成树(MST)-Kruskal算法
#include<bits/stdc++.h>#define maxn 100using namespace std;struct edge{ int u,v,w;}edges[maxn];int vis[maxn],m,n,s[maxn];//边的标记,顶点数,边数,并查集bool cmp(edge e1,edge e2){ if(e1.w!=e2.w) return e1.w<e2.w; else { if(e1.u!=e2.u) r原创 2021-06-18 19:30:53 · 166 阅读 · 0 评论 -
最小生成树(MST)-Prim算法
#include<bits/stdc++.h>#define maxn 100#define INF 0x3f3f3fusing namespace std;int g[maxn][maxn],dis[maxn],path[maxn],vis[maxn];int m,n;//顶点数,边数void Prim(){ vis[1]=1;//从顶点1开始出发 for(int i=1;i<=m;i++){ dis[i]=g[1][i]; if(di原创 2021-06-18 18:26:22 · 153 阅读 · 0 评论 -
弗洛伊德求最短路径-Floyd
#include<bits/stdc++.h>#define maxn 100#define INF 0x3f3f3fusing namespace std;int m,n,dist[maxn][maxn];//顶点数,边数,两点之间的距离void Floyd(){ for(int k=0;k<m;k++){ for(int i=1;i<=m;i++){ for(int j=1;j<=m;j++){原创 2021-06-18 17:49:55 · 76 阅读 · 0 评论 -
迪杰斯特拉算法-Dijsktra
#include<bits/stdc++.h>#define maxn 100#define INF 0x3f3f3f//无穷大using namespace std;int g[maxn][maxn],dist[maxn],path[maxn],vis[maxn];//邻接矩阵,距离,路径,标记;int m,n;//顶点数,边数;void Dij(int v){ vis[v]=1;path[v]=0;//初始化数组 for(int i=1;i<=m;i++){原创 2021-06-18 17:33:29 · 98 阅读 · 0 评论 -
P4913 【深基16.例3】二叉树深度
题目描述给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 1),如果是叶子节点,则输入0 0。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。最多有 1e6个节点输入格式无输出格式无输入输出样例输入 #172 73 64 50 00 00 00 0输出 #14本题先根据条件用数组建一棵树,然后通过dfs求解#include<bits/stdc++.h>#define max 1000001using name原创 2021-06-10 20:55:24 · 134 阅读 · 0 评论 -
堆排序-heapSort
#include<bits/stdc++.h>using namespace std;void sift(vector<int>&arr, int i, int L){ int temp = arr[i]; for (int k = 2 * i + 1; k < L; k = 2 * i + 1) { if ((k+1 < L)&&arr[k] < arr[k + 1]) { k++; } if (temp原创 2021-06-10 18:52:31 · 95 阅读 · 0 评论 -
快速排序-quickSort
#include<bits/stdc++.h>#define max 100using namespace std;int a[max],n;void quickSort(int low,int high){ if(low>=high) return; int t=a[low],l=low,h=high; while(low<high) { while(low<high&&a[high]>t) hi原创 2021-06-10 16:07:15 · 75 阅读 · 0 评论 -
冒泡排序-bubbleSort
#include<bits/stdc++.h>#define max 100using namespace std;int a[max],n;void bubbleSort(){ for(int i=0;i<n-1;i++)//n个数n-1轮 { for(int j=0;j<n-i-1;j++) { if(a[j]>a[j+1]) { int原创 2021-06-10 16:05:50 · 117 阅读 · 0 评论 -
选择排序-selectSort
#include<bits/stdc++.h>#define max 100using namespace std;int a[max],n;void selectSort(){ for(int i=0;i<n;i++) { int min=a[i],index=i; for(int j=i+1;j<n;j++)//从未排序的序列中选出最小的 { if(a[j]<min)原创 2021-06-10 16:04:10 · 92 阅读 · 0 评论 -
希尔排序-shellSort
#include<bits/stdc++.h>#define max 1000using namespace std;int a[max],n;void shellSort(){ int incr=n/2;//间隔增量 while(incr) { for(int i=incr;i<n;i++) { int j; int temp=a[i]; for(j=原创 2021-06-09 21:08:37 · 129 阅读 · 0 评论 -
插入排序-insertSort
#include<bits/stdc++.h>#define max 100using namespace std;int a[max],n;void insertSort(){ for(int i=1;i<n;i++) { int temp=a[i];//记录要插入的值 int j; for(j=i-1;j>=0;j--)//查找和移动一遍循环完成 { if(a[j]&原创 2021-06-08 21:21:21 · 179 阅读 · 0 评论 -
八皇后 Checker Challenge
题目描述一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列 2 4 6 1 3 5来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下:行号 1 2 3 4 5 6列号 2 4 6 1 3 5这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。请输出前 3 个解。最后一行是解的总个数。输入格式一行一个正整原创 2021-06-06 01:09:19 · 271 阅读 · 0 评论 -
数独-dfs
【问题描述】数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9X9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。要求使用合适的数据结构和算法,求解出所有剩余空格的数字。【输入形式】输入为9X9的二维数组,每个数字均为0-9之间的数字,其中0表示该位置的数字为未知。【输出形式】输出为9X9的二维数组,每个数字均为1-9之间的数字,满足【样例输入】0 0 3 5 0 0 0 0 20 0 8 6 0 0 0 0 00 7 0 0原创 2021-06-05 19:03:40 · 475 阅读 · 5 评论 -
UVA572 油田 Oil Deposits
题意翻译【题目大意】输入多个m行n列的矩阵,用00表示输入结束。找出有多少块石油区域,用“@”代表石油,假如两个“@”在横,竖或对角线上相邻,就说它们位于同一区域,对于每个输入,输出一个数表示有几个石油区域。输入输出样例输入 #11 1*3 5@@*@@@*1 8@@***@5 5****@@@@@**@@@@@@@**@0 0输出 #10122#include<bits/stdc++.h>#define max 110using nam...原创 2021-06-05 16:34:03 · 131 阅读 · 0 评论 -
二叉树-根据中序遍历和后序遍历求前序遍历
题目描述给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 8≤8)。输入格式22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。输出格式11行,表示一棵二叉树的先序。输入输出样例输入 #1BADCBDCA输出 #1ABCD说明/提示【题目来源】NOIP 2001 普及组第三题这题很简单,递归就行#include<bits/stdc++.h>#define max 10using namespace s原创 2021-06-05 16:14:26 · 1125 阅读 · 1 评论 -
二叉查找树的后序遍历
【问题描述】输入一个整数数组,判断该数组是不是某二叉查找树的后序遍历的结果。如果是返回true,否则返回false。【输入形式】输入任意长度的数组,数字之间空格分开【输出形式】true 或者 false【样例输入】输入5 7 6 9 11 10 8【样例输出】true【样例说明】由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10/ \ / \5 7 9 11因此返回true。【评分标准】暴力求解法不得分。【原创 2021-06-01 22:16:24 · 597 阅读 · 1 评论 -
二叉排序树的判定
【问题描述】课后作业第6题。试写一个判别给定二叉树是否为二叉排序树的算法。以前序遍历序列和中序遍历序列给出该二叉树的结点,并创建该二叉树。然后再进行判断。请注意,树中结点关键字可能相同。【样例输入1】6 4 5 8 6 9 04 5 6 6 8 9 0【样例输出1】true【样例输入2】6 4 7 8 04 7 6 8 0【样例输出2】false【提示】若直接根据给定的中序是否有序来进行判断,此种判断方法不得分。务必先创建二叉树的链式存储,再对其进行判断。#include<bi原创 2021-06-01 22:13:29 · 2077 阅读 · 0 评论 -
二叉排序树的创建、删除、遍历、查找
【问题描述】请根据输入的数据创建一棵二叉排序树。然后执行相应操作。1 删除某一值为x的结点2 求指定结点y在二叉排序树中的层数【输入形式】结点数据,以0代表结束输入。待删除的x,待求层数的y【输出形式】创建好的二叉排序树的拓展的前序遍历结果删除后的二叉排序树的中序遍历结果y所在的层数【样例输入】29 39 15 25 28 10 11 2 01011【样例输出】29 15 10 2 # # 11 # # 25 # 28 # # 39 # #2 11 15 25 28 29原创 2021-05-29 14:57:12 · 480 阅读 · 0 评论 -
迷宫问题(dfs)
#include<bits/stdc++.h>using namespace std;int di_x[4]={0,1,0,-1};int di_y[4]={1,0,-1,0};int visit[10][10];char maze[10][10];int s_x,s_y,e_x,e_y;//起点和终点int falg=0;//是否走出迷宫void dfs(int x,int y){ if(x==e_x&&y==e_y)//找到出口后,标记为1,退出,结原创 2021-05-28 16:55:55 · 110 阅读 · 0 评论 -
弗洛伊德算法求最短路径
对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径。【输入形式】顶点个数n,以及n*n的邻接矩阵,其中不可达使用9999代替【输出形式】每两个顶点之间的最短路径和经过的顶点注意:顶点自身到自身的dist值为0,path则为该顶点的编号【样例输入】49999 4 11 99996 9999 2 99991 9999 9999 19999 3 9999 9999【样例输出】from 0 to 0: dist = 0 path:0from 0原创 2021-05-24 16:02:13 · 922 阅读 · 0 评论 -
有向无环图的拓扑排序
【问题描述】由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义分别如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。由偏序定义得到拓扑有序的操作便是拓扑排序。拓扑排序的流程如下:在有向图中选一个没有前驱的顶点并且输出之;从图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种原创 2021-05-20 19:57:34 · 702 阅读 · 0 评论 -
拓扑排序和关键路径
【问题描述】若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续的时间),则此带权的有向图称为AOE网。如果用AOE网来表示一项工程,那么,仅仅考虑各个子工程之间的优先关系还不够,更多的是关心整个工程完成的最短时间是多少;哪些活动的延期将会影响整个工程的进度,而加速这些活动是否会提高整个工程的效率。因此,通常在AOE网中列出完成预定工程计划所需要进行的活动,每个活动计划完成的时间,要发生哪些事件以及这些事件与活动之间的关系,从而可以确定该项工程是否可行,估算工程完成的原创 2021-05-20 18:01:55 · 435 阅读 · 0 评论 -
确定比赛名次
【问题描述】此题为ACM竞赛真题,更强大的测试数据请自行前往以下链接进行代码提交验证。Problem - 1285 (hdu.edu.cn)有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。【输入形式】输入有若干组,每组中的第一行为二个数N(1<=N&l原创 2021-05-20 15:53:50 · 211 阅读 · 0 评论 -
无向图的割点
【问题描述】求一个无向连通图的割点。割点的定义是:若删除此结点和与其相关联的边,无向图不再连通。【输入形式】第一行是顶点个数及边的条数,后续每一行是每条边的两端关联的两个顶点【输出形式】割点,若没有割点,则输出NO【样例输入】7 8A BA DB CC DC GD ED FE F【样例输出】C D【样例输入】5 7A BB CB DA DC DA EE C【样例输出】NO#include<iostream>#define maxsize原创 2021-05-18 18:08:24 · 485 阅读 · 0 评论 -
Jungle Roads
请用kruskal算法编程实现下面的问题。DescriptionThe Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road netwo原创 2021-05-16 17:12:04 · 153 阅读 · 0 评论 -
最小生成树的权值之和-Prim算法
【问题描述】已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出,只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对。请采用Prim算法,求该连通图从1号顶点出发的最小生成树的权值之和。【输入形式】第一行给出结点个数n和三元组的个数count,以下每行给出一个三元组,数之间用空格隔开。(注意这里顶点的序号是从1到n,而不是0到n-1,程序里要小心!)【输出形式】求解的最小生成树的各条边、边的权值之和【样例输入】5 82 1 73 1 63原创 2021-05-16 15:12:51 · 6730 阅读 · 0 评论 -
图的遍历及连通性
【问题描述】根据输入的图的邻接矩阵A,判断此图的连通分量的个数。请使用邻接矩阵的存储结构创建图的存储,并采用BFS优先遍历算法实现,否则不得分。【输入形式】第一行为图的结点个数n,之后的n行为邻接矩阵的内容,每行n个数表示。其中A[i][j]=1表示两个结点邻接,而A[i][j]=0表示两个结点无邻接关系。【输出形式】输出此图连通分量的个数。【样例输入】50 1 1 0 01 0 1 0 01 1 0 0 00 0 0 0 10 0 0 1 0【样例输出】2【样例说明】邻接矩原创 2021-05-15 20:31:11 · 1105 阅读 · 0 评论 -
犯罪团伙
【题目描述】此题必须采用邻接表的存储结构,建立图的存储,然后采用DFS遍历实现求解。否则不给分。警察抓到了 n 个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从 1 至 n。【输入】第一行:n(<=1000,罪犯数量),第二行:m(<5000,关系数量)以下若干行:每行两个数:I原创 2021-05-15 20:11:03 · 596 阅读 · 0 评论 -
图形窗口问题
【问题描述】 在某图形操作系统中,有N个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。 当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。 现在我们希望你写一个程序模拟点击窗口的过程。【输入形式】输入的第一行有两个正整数,即N和M。(.原创 2021-05-15 20:07:53 · 243 阅读 · 0 评论 -
广义表建树+层次遍历
栈的应用-进制转换欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行原创 2021-05-09 15:32:47 · 478 阅读 · 0 评论