- 博客(28)
- 收藏
- 关注
原创 c++STl的全排列
STL有一个函数next_permutation(),它的作用是如果对于一个序列,存在按照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。#include <cstdio>#include <iostream>#include <algorithm>using namespace std;void permutation(int a[], int len
2016-02-19 23:10:16
284
原创 全排列
//未去重全排列#include <iostream>#include <cstdio>using namespace std;void func(int a[], int m_begin, int m_end)//m_begin表示当前选到第几个了,m_end表示总共多少个数{ int i; if(m_begin + 1 == m_end){ for(i =
2016-02-19 23:09:34
296
原创 快速排序
#include <cstdio>void qsort(int a[], int l, int r){ //if(l >= r) return ; if(l < r) { int i = l, j = r, key = a[l];//中值 while (i < j) { while(i < j && a
2016-02-19 23:08:14
290
转载 计数排序
#include <stdio.h> //计数排序要求输入的元素是0到k之间void countSort(int a[], int b[], int array_size, int k)//k是a数组中最大的数{ int c[k+1], i;
2016-02-19 23:07:02
337
原创 归并排序
#include<stdio.h>int a[10000], b[10000];void mergearray(int a[], int first, int mid, int last, int temp[])//temp数组用于临时储存另外一组数{ int i = first, j = mid + 1; int k = 0; while(i <= mid && j <
2016-02-19 23:06:09
170
原创 堆排序
#include <iostream>#include <cstdio>using namespace std;void heapAdjust(int a[], int i, int sizeOfheap)//调整堆 (调整范围:i与i下面的子树){ int lchild = 2 * i; //i的左孩子节点序号 int rchild = 2 * i + 1;
2016-02-19 23:05:19
140
原创 插入排序
#include<stdio.h>int main(){ int a[5]={5,4,1,3,2},i,j,t; int n=5; for(i=1;i<n;i++) //i从数组中的第2个数开始 { t=a[i]; //把要插的元素先记住 for(j=i-1;j>=0&&a[j]>t;j--) //先看j是否是大于等
2016-02-19 23:04:48
146
原创 kmp
例如:模式串如果是: A B C D A B Dnext数组: -1 0 0 0 0 1 2例如:如果匹配到D失败了就通过next数组递归到前面的C. 用next数组来记录前面已经匹配成功过的信息,如:尽管退回到C了但前面还是有AB是已经匹配成功的next[j]的值(也就是k)表示,当P[j] != T[i]时,j指针的下一步移动位置。#in
2016-02-19 23:04:00
177
转载 带权并查集 poj1182
/*带权并查集: 1 所谓的带权,我的理解是根节点和儿子节点之间的关系不再是那种单纯的所属关系,而是增加了一个权值来表示他们之间的特殊关系。比如距离就可以作为权值,在带权并查集里,需要注意的是。首先,rank数组不再表示哪一个是大树,而是表示某个节点到根节点的权值。第二在路径压缩的过程中需要利用递归的思想把路径上的点的rank值进行更新。最后就是合并的时候,不再是
2016-02-19 23:03:08
182
原创 普通并查集之宗教问题(题目)
题目:宗教问题第一行输入n(人数),m(关系数)接着换行输入m个关系换行输入询问次数q换行输入询问每组询问对应一组输出:如果是则输出YES,否或不一定都输出NO例:5 3 ,5个人,3个关系1 2 1说他在自己的教堂里看到过22 3 2说他在自己的教堂里看到过34 5 4说他在自己的教堂里看到过52 2组询问次数1 3 问:1和
2016-02-19 23:01:29
196
转载 普通并查集基本操作
#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#define MAXN 1000using namespace std;int father[MAXN];//存储节点的父亲节点,如果父亲节点就是自己则说明是根节点int rank[MAXN];/*rank数组用来存储大树的秩并且作为大树的标记*
2016-02-19 22:59:45
207
原创 最小生成树之普里姆算法
//lowcost数组里的值是adjvex数组里的点指向相应下标的点的权值//lowcost数组保存相关顶点到邻接点(边)的权值,此权值是生成树里的点到该邻接点的最小权值/*例如: 0 1 2 3 4 5 6 A B C D E F Gadjvex: 0 0 0 0 3 3 0lowcost:0 7
2016-02-19 22:58:33
451
原创 图论之广度优先遍历
//邻接矩阵版#include <stdio.h>#include <queue>using namespace std;#define MAXVEX 100 //最大顶点数,应由用户定义#define INFINITY 65535 //用65535来代表∞bool visited[MAXVEX];
2016-02-19 22:57:24
278
原创 图论之深度优先遍历
//邻接矩阵版#include <stdio.h>#define MAXVEX 100 //最大顶点数,应由用户定义#define INFINITY 65535 //用65535来代表∞bool visited[MAXVEX]; //访问标志数组typedef char Verte
2016-02-19 22:56:04
384
原创 图论之图的存储方式
#include <cstdio>//图的储存结构#define MAXVEX 100 //最大顶点数,应由用户定义#define INFINITY 65535 //用65535来代表∞//邻接矩阵表示法 有向图,无向图的表示法 , 无向图是对称的typedef char VertexType;
2016-02-19 22:54:47
388
原创 字典树hihocoder1014
小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?”身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字符串是不是这
2016-02-19 22:53:37
376
原创 字典树(hdu1671)
题意:给定n个电话号码串,问这n个电话号码串中是否存在某一串是其它串的前缀,如果存在输出NO,否则YES 思路:把这n个电话号码串建立成字典树,在插入的时候我们直接判断当前插入的字符串是不是其它串的前缀或者其它串是不是这个串的前缀即可//解法一:用动态分配#include <iostream>#include <cstdio>#include <cstdlib>#include <c
2016-02-19 22:52:40
264
原创 字典树(hdu1075)
hdu1075 题意:给定一个映射表的关系,给定每个单词的对应的映射的单词。现在给定一段字符串,要求如果单词能够翻译就进行翻译,否则原样输出,但是注意所有的\n,\r,空格以及所有的标点符号都是不翻译的。 思路:先对映射表的单词建立字典树,每个单词的尾节点标记这个单词所映射的单词的下标,那么对于给定的字符串,我们只要把所有的单词进行解析去字典树中查找即可。//解法一:建一个映射表和字典树
2016-02-19 22:50:04
353
原创 最优二叉树之哈夫曼编码
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define N 100 // 默认编码字符的个数的范围为1~100,如果后面输入的n大于100则要在这里做修改#define M (2*N-1) // 树中总的结点数目 N也是树中的
2016-02-19 22:48:57
496
原创 二叉搜索树基本操作
#include <cstdio>#include <cstdlib>#include <queue>#include <stack>//查找值这类不修改原数据的行为,则用pnode,要插入,删除,建树,则用pnode* 指向指针的指针typedef struct searchtree{ int key; struct searchtree *lchild; //左孩子指
2016-02-19 22:47:24
298
原创 二叉树基本操作(完整版)
#include <cstdio>#include <cstdlib>#include <queue>#include <stack>//1二叉树中节点的的结构struct treenode{ struct treenode *lchild; struct treenode *rchild; struct treenode *father; int level
2016-02-19 22:46:04
298
原创 二叉树 基本操作(最初版)
#include <cstdio>#include <cstdlib>#include <stack>#include <queue>using namespace std;//二叉树结点typedef struct buildnode{ //数据 char data; //左右孩子指针 struct buildnode *lchild, *rchild;
2016-02-19 22:45:14
151
原创 优先队列(堆实现)
#include <iostream>#include <cstdio>using namespace std;int sizeOfheap, mark;void heapAdjust(int a[], int i, int sizeOfheap)//调整堆 (调整范围:i与i下面的子树){ int lchild = 2 * i; //i的左孩子节点序号 int
2016-02-19 22:42:06
221
原创 队列 hdu1276
//先说明cmp里是个用于踢人的函数,然后先去写主函数,//i=1(二) i=2(三) i=3(二) i=4(三) 所以,i是偶数则数到3踢人,否则数到2踢人#include <cstdio>#include <iostream>#include <queue>using namespace std;queue <int> s;void cmp(int k){ int i =
2016-02-19 22:40:54
663
原创 队列
//结构数组实现#include<stdio.h>#define MAX_SIZE 1000int que_length = 0;int que_rear = 0;int que_front = 0;struct fifo{ int data;}que[MAX_SIZE];int length(){ return que_length;}void push(int
2016-02-19 22:39:17
146
原创 栈
hdu1022//(题目)注意:三辆火车的编号一定不同#include<stdio.h>int ans[100],ansize;char sta[100],ssize,a[100],b[100];void push(char v){ sta[ssize++]=v;}char pop(){ return sta[--ssize]; //size已经减1了}int
2016-02-19 22:35:27
178
原创 循环链表
约瑟夫环:从1开始:#include<stdio.h>#include<stdlib.h>struct node{ int v; struct node *next;}*head;void insert_node(int val) //头插法{ struct node *p=(struct node*)malloc(
2016-02-19 22:29:17
173
原创 链表
链表学习一些学习中的探索输入n,表示要输入n个数,输入n个数,建链表,用链表的方法输出n个数顺序输出#include<stdio.h>#include<stdlib.h>void prn(struct node *head);struct node{ int data; struct node *next; }; struct node *p,
2016-02-19 22:22:53
191
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人