
数据结构与算法
wosiguwozai0133
这个作者很懒,什么都没留下…
展开
-
桶排序
看完啊哈算法:这时候应该总结一波,感谢兵哥 桶排序:代码如下:#include <stdio.h>int main(){ int book[1001];//桶的个数 int i,j,t,n; for(i=0;i<=1000;i++) book[i] = 0; scanf("%d",&n);//输入n个数 for(i=1;i<=n;i++)原创 2017-03-02 16:24:25 · 259 阅读 · 0 评论 -
树状数组
树状数组这篇文章写的挺好的,让我终于理解了树状数组的作用: 树状数组 树状数组几个模板代码:1.lowbitint lowbit(int x){ return x & (-x);}/*求前i位的和*/int getSum(int i){ int s = 0; while(i > 0) { s += C[i];原创 2017-10-17 22:36:42 · 203 阅读 · 0 评论 -
c++ 根据当前的时间转化为一串数字
如何用c++利用系统时间生成由数学组成的字符串,譬如现在系统时间是2014年12月30号09点30分,就生成一个201412300930的字符串代码来自于知乎:https://www.zhihu.com/question/27313814 iyomumx 的回答: 本代码仅供学习用:#include <chrono>#include <ctime>#include <iomanip>#in转载 2017-06-08 17:20:50 · 2445 阅读 · 0 评论 -
二分匹配
二分匹配: 参考《算法的乐趣》 Gale-Shapley 算法原理:/*算法:M:男生状态, W女生状态初始化所有的m 属于 M , w 属于W, m,w处于自由状态;while(存在m是自由的,并且他还没对每个女人都求过婚){ 选择这样的一个男人m; w = m 的优先选择表中还没有求过婚的排名最高的女人; if(w 是自由状态) { 将(m原创 2017-05-01 11:03:01 · 264 阅读 · 0 评论 -
八皇后问题:
思路:转自:八皇后 显然,每一行可以而且必须放一个皇后,所以n皇后问题的解可以用一个n元向量X=(x1,x2,…..xn)表示,其中,1≤ i≤ n且1≤ xi≤ n,即第n个皇后放在第i行第xi列上。由于两个皇后不能放在同一列上,所以,解向量X必须满足的约束条件为:xi≠ xj;若两个皇后的摆放位置分别是(i,xi)和(j,xj),在棋盘上斜率为-1的斜线上,满足条件i-j=xi-xj;在棋盘原创 2017-03-14 21:01:49 · 366 阅读 · 0 评论 -
图的割点,割边
割点:算法:先深度优先遍历u点,然后判断不经过u点的情况下是否还能回到之前访问的任意一点。 再对v点进行一次深度优先遍历,看能不能回到祖先,能回到祖先,u不是割点,否则是割点。“`原创 2017-03-20 18:20:45 · 542 阅读 · 0 评论 -
图的最小生成树
先介绍prim算法: 算法: 1,从任意一个顶点开始构造树,假设从1号点,首先将顶点1加入生成树,用一个以为数组book来标记哪些顶点加入了生成树 2.用数组dis记录生成树到各个顶点的距离,最初生成树只有1号顶点,有直连边时,数组dis存储就是1号顶点到该边的权值,没有直连边事原创 2017-03-02 20:51:14 · 353 阅读 · 0 评论 -
建堆和堆排序
从小到大建立最大堆,不建立最小堆下面代码很清晰,是啊哈c中的代码,注释很好。 这里涉及建堆,向下压,堆排序。good code。 #include <iostream>#include <cstdio>using namespace std;int n,h[101];void swap(int x,int y){ int temp; temp = h[x]; h[x]=原创 2017-03-02 20:30:10 · 332 阅读 · 0 评论 -
Bellman-Ford -解决负权边
Dijkstra 算法终于理解,但是不能有负权边,让我们看看BellmanFord 核心代码:for(k=1;k<=n-1;k++) for(i=1;i<=m;i++) if(dis[v[i]] > dis[u[i]] + w[i]) dis[v[i]] = dis[u[i]] + w[i];上面的代码中,外循环一共循环乐n-1次,内循环循环了m次,。 第i原创 2017-03-02 20:06:21 · 305 阅读 · 0 评论 -
Dijkstra 算法-通过边实现松弛
一个点(源点) 到其余哥哥顶点的最短路径:单元最短路径。算法步骤如下: 1。将所有的顶点分为两部分:已知最短路程的顶点集合p和未知最短路径的集合顶点集合Q。最开始,已知最短路径的顶点集合p只有源点一个顶点,我们这里可以用一个book数组来记录哪些顶点在集合p中哪些顶点在集合Q中。book[i]=1,表示在p中,=0在Q中 2.设置源点S到自己的最短路径为0,级dis[s] = 0.若存在有源电能直原创 2017-03-02 19:40:12 · 436 阅读 · 0 评论 -
最短路径(Floyd-warshall)
求图中任意两点的最小距离: Floyd关键代码//关键算法for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;i<=n;i++) { if(e[i][j] > e[i][k]+e[k][j]) e[i][j] = e[i]原创 2017-03-02 19:03:15 · 369 阅读 · 0 评论 -
深度优先遍历,广度优先遍历
深度优先遍历思想:以一个未访问的节点为起始顶点,沿当前顶点的边走到位访问的顶点;当没有未访问的节点时回溯到上一个顶点,继续试探别的顶点。广度搜索: 一般建立一个队列。当所有边的权值相同的情况下,广度搜索的时间更快。原创 2017-03-02 18:53:43 · 401 阅读 · 0 评论 -
广度优先遍历
还是上面那道题: 深度遍历一般是用递归,深度不断增加,广度搜索一般用队列这样的形式存储东西;#include <iostream>#include <cstdio>using namespace std;struct note{ int x; int y; int f; int s};int main(){ struct note que[2501]原创 2017-03-02 18:31:23 · 428 阅读 · 0 评论 -
深度遍历
就以迷宫为例吧。代码如下://深度搜索:解救小哈#include <iostream>#include <cstdio>using namespace std;int a[51][51],book[51][51];int n,m,p,q,min = 99999999;//整个dfsvoid dfs(int x,int y,int step){ int next[4][2] = {原创 2017-03-02 18:04:02 · 314 阅读 · 0 评论 -
快速排序
快速排序: 首先找一个基准数: (参照的数,一般是第一个); 例如:6 1 2 7 9 3 4 5 10 8 算法过程:先从右往左找一个小于 6 的书,然后交换他们,可以用变量i,j分别指向序列的最左最又。修改过程回去看一下算法导论吧 代码如下:int Partition(int l,int r,vector<int> &a){ int temp = a[l]; int i=原创 2017-03-02 16:52:05 · 232 阅读 · 0 评论 -
Trie 树
Trie 树主要是Insert 和search题目: hoj 前缀查询: 直接上对应的代码吧:class TriNode{public: TriNode(); ~TriNode();public: int Count; TriNode *next[26]; bool exist;};TriNode::TriNode(){ Count = 0原创 2018-02-01 18:27:36 · 232 阅读 · 0 评论