
数据结构
NameiCc
己不由心,身又岂能由己
展开
-
拓扑排序
拓扑排序就是根据给出的集合上的偏序关系得到该集合上的一个全序。进行拓扑排序可以根据入度求出:不断地选择入度为0的结点,并且删除该结点以及以该结点为起点的弧。如果在过程中所有的结点入度均大于0,则证明无法进行拓扑排序。int n; //结点数int m; //偏序数void TopoSort(){ memset(G,0,sizeof(G)); memset(in,0,siz原创 2015-06-16 13:23:12 · 377 阅读 · 0 评论 -
二叉树四种遍历(递归)
二叉树的每个结点最多有两棵子树,分别为左右子树()原创 2015-06-11 15:27:26 · 403 阅读 · 0 评论 -
堆排序
堆排序属于选择排序,单列出来是因为比较重要和比较困难。。先说一下,筛选过程是将一段序列通过元素交换使得该段序列的元素构成一个大顶堆。然后,堆的初始化过程,就是从最后一个非叶子结点开始筛选直到根结点,这样多次筛选之后就是一个大顶堆了。 初始化之后,那么根结点的元素一定是最大的元素,然后跟最后一个位置的元素交换。然后,再重建大顶堆(范围逐渐缩小,有序的元素不再参与),交换,直到只有堆顶元素无序。这原创 2015-06-23 17:59:10 · 553 阅读 · 0 评论 -
邻接矩阵图的dfs和bfs
int G[maxn][maxn];int n; //点数int m; //边数int vis[maxn];void init(){ memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); for(int i=0; i<m; i++) { int u,v; scanf("%d%d"原创 2015-06-14 17:23:35 · 526 阅读 · 0 评论 -
简单选择排序
简单选择排序是每次选择第i小的元素,放到第i位置。第i小的元素只需要从未排序的元素中选出最小的就是。#include #include #include using namespace std;#define maxn 20typedef struct SqList{ int r[maxn]; int Length;}SqList;void InitSqL原创 2015-06-22 15:33:55 · 484 阅读 · 0 评论 -
插入排序(直接插入+希尔排序)
直接插入排序是将元素按顺序插入已经排好序的序列中。对于待插入的元素,如果比最后一个元素还大,则不用处理。否则,从后边元素开始比较,并顺次后移,直到碰到元素小于或者等于该元素。设置第一个元素位置为哨兵,用来存放待插入元素。#include #include #include using namespace std;#define maxn 20typedef struct SqL原创 2015-06-22 14:40:18 · 475 阅读 · 0 评论 -
最短路
单源最短路问题就是求出图中源点到所有结点的最小距离。Dijkstra算法每次找出距离源点最近的点,然后更新举例。 int n; //顶点数int m; //边数void init(){ int u,v,w; for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) G[i][j] =原创 2015-06-16 19:08:54 · 302 阅读 · 0 评论 -
并查集
并查集用于把一些不相交的集合进行合并,查询两个元素是否属于同一集合等。并查集初始化,是将单个元素华为单独的集合。查,是查找元素所在的集合(根节点)。并,是将两个元素所在的集合合并为一个集合。/*初始化*/void init(){ for(int i=0; i<maxn; i++) fa[i] = i;}/*查找所在集合*/int find_set(int x原创 2015-06-14 13:41:29 · 302 阅读 · 0 评论 -
归并排序
归并排序,是将子序列进行两两合并,最后并为一个有序序列。#include #include #include using namespace std;#define maxn 20void Merge(int a[],int low,int mid,int high){ int i=low; int j=mid+1; int b[maxn];原创 2015-06-22 15:44:27 · 457 阅读 · 0 评论 -
快速排序
快速排序是对冒泡排序的一种改进。快速排序是选定一个枢轴,通过一趟排序使得枢轴左侧的元素都比枢轴元素小,右边元素都比枢轴元素大,然后再递归的对两侧元素同样处理,最后达到整个序列的有序。继续度娘盗图。。。#include #include #include using namespace std;#define maxn 20typedef struct SqList{原创 2015-06-22 15:15:43 · 484 阅读 · 0 评论 -
最小生成树
最小生成树是含有n个结点的连通图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。求解最小生成树可以用Prim或者Kruskal算法。int n; //顶点数int m; //边数/*Prim算法*/int vis[maxn];int pre[maxn];int dist[maxn];int G[maxn][maxn];void Prim(){原创 2015-06-14 15:31:29 · 314 阅读 · 0 评论 -
欧拉回路
对于给定的图G,如果从某个结点出发走一条道路,使得它恰好通过G的每一条边恰好一次,该路径成为欧拉道路。如果该路径起点终点相同,那么成为欧拉回路(可见,欧拉回路是特殊的欧拉道路)。这也是一笔画问题。不同的图,欧拉道路和回路的判断条件也不同,当然图都必须是连通图。如果是有向图,存在欧拉道路的条件是没有或者只有两个入度不等于出度的点,并且必须是一个点的出度比入度大一(欧拉道路的起点),一个点的入度比原创 2015-06-19 17:44:11 · 519 阅读 · 0 评论 -
树状数组
下面是我自己对树状数组的认识。。。树状数组,是一个查询和修改复杂度都为log(n)的数据结构。树状数组支持区间查询,单值修改。树状数组之所以查询快速,是因为相当于对数组有效的划分和维护。这图是盗的度娘的。。。C数组就是树状数组。C[1]=A[1];C[2]=A[1]+A[2];C[3]=A[3];C[4]=A[1]+A[2]+A[3]+A[4];C[5]=A[5];原创 2015-06-18 14:41:48 · 550 阅读 · 0 评论 -
字典树
字典树,是一种存取字符串的树状存储结构,以字符串的每一个字符为结点,不断扩展。从根节点到叶子结点,途中经过的结点的值连接起来就是该字符串。该存储方式可以有效的减少空间的浪费,有很多字符串可以公用一些结点,减少了空间上的开支。在查找的时候也比较方便,若查询到某一个字符时,该结点不存在,那么该字符串必然不存在。#include #include #include #include #inc原创 2015-06-18 14:08:26 · 681 阅读 · 0 评论 -
Huffman树
从树中一个结点到另外一个结点路径上的分支数目,称作路径长度。结点的带权路径长度为从该结点到根结点之间的路径长度与结点上权的乘积。Huffman树,又称最优树,是带权路径长度最短的树。树的带权路径长度是树中所有叶子结点的带权路径长度之和。Huffman树的构造方法是不断地选取权值最小的两棵树作为左右子树构造一棵新的二叉树,其权值为两棵子树的权值之和,直到只有一棵树为止。Huffman原创 2015-06-14 15:55:12 · 436 阅读 · 0 评论