随笔分类 - 编程
摘要:distance 求距离 例子: #include <iostream> #include <iterator> #include <vector> using namespace std; int main() { vector<int> v; v.push_back(3); v.push_bac
阅读全文
摘要:全排列 next_permutation() 在头文件<algorithm>里面有如下代码: int a[]; do { } while(next_permutation(a,a+n)); 例子: #include<bits/stdc++.h> #include<set> #include<vect
阅读全文
摘要:背包问题 问题描述: 给定n种物品,1个背包,背包容量为c,每个物品i的价值为vi,重量为wi,如何选择装入物品能使背包的总价值最大? 注意:与0-1背包问题不同,在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1<=i<=n 形式化描述: 给定c >0, wi >0, vi
阅读全文
摘要:钱币找零问题 这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然
阅读全文
摘要:Ubiquitous Religions 描述 当今世界上有太多不同的宗教,很难一一掌握。您有兴趣找出您大学中有多少不同宗教信仰的学生。您知道您的大学中有n个学生(0 <n <= 50000)。向每个学生询问他们的宗教信仰是不可行的。此外,许多学生不愿意表达自己的信念。避免这些问题的一种方法是,问m
阅读全文
摘要:HDU1213 How many tables 问题描述 今天是依纳爵(Ignatius)的生日。他邀请了很多朋友。现在是晚饭时间。伊格内修斯想知道他至少需要多少张桌子。您必须注意,并不是所有的朋友都彼此认识,并且所有的朋友都不想和陌生人呆在一起。解决此问题的一条重要规则是,如果我告诉您A认识B,而
阅读全文
摘要:1111. 有效括号的嵌套深度 有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。 嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。 有效括号字符串
阅读全文
摘要:最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树。最小生成树属于一种树形结构(树形结构是一种特殊的图),或者说是直链型结构,因为当n个点相连,且路径和最短,那么将它们相连的路一定是n-1条。 可以利用参考一个
阅读全文
摘要:最短路径-弗洛伊德(Floyd)算法 算法简介 弗洛伊德算法与迪杰斯特拉算法是公认的最著名的两种最短路径求解算法,接下来介绍弗洛伊德算法,弗洛伊德算法的思路是:首先初始化距离矩阵,然后从第一个点开始逐渐更新矩阵点值。d[i][j]表示从i点到j点的距离。第k次更新时,判断d[i][k]+d[k][j
阅读全文
摘要:何为最短路径 最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径,大致可以分为如下几种问题,可无论如何分类问题,其本质思想还是不变的,即,求两点间的最短距离。 a) 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。 b) 确定终点的最短路
阅读全文
摘要:哈夫曼树 简介 哈夫曼树(Huffman Tree),又名:最优二叉树,赫夫曼树 其标准含义是:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 相关名词 由于本篇存在一定
阅读全文
摘要:树与森林 1. 什么是森林 森林,顾名思义,就是由众多的树构成的一组数据结构,这些树本身没有什么联系,用系统的语言描述就是:森林:m(>=0)棵互不相交的树的集合 【注意这里森林是可以有0颗树的,同数学上的空集】 如果把一棵树当作一个独立的点,那么森林就是一个点的集合。 2. 树转换成二叉树 操作过
阅读全文
摘要:克鲁斯卡尔算法(Kruskal算法)求最小生成树 克鲁斯卡尔算法简介 克鲁斯卡尔算法是一种用来寻找最小生成树的算法(用来求加权连通图的最小生成树的算法)。在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。 而具体的操作过程为: a) 将图的所有连接线去掉,只剩顶点 b
阅读全文
摘要:平衡二叉树详解 简介 平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 其中最为经典当属AVL树,我们 总计而言就
阅读全文
摘要:题目描述 某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路? 输入格式 输入包含若干组测试测试数据,每组测试数据的第
阅读全文
摘要:P1551 亲戚 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 题目描述 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。 输入格式 第一
阅读全文
摘要:并查集 并查集是数据结构中的一个重要算法,可以管理元素分组,并查集由三部分构成:初始化,找父节点,合并结点,直接来看并查集的模板: const int max_size=1000; int pre[max_size]; void init_set(int count){ for (int i = 1
阅读全文
摘要:并查集 一、关于并查集 1. 定义 并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构。 2. 基本操作 1. 合并(Union/Merge):合并两个集合。2. 查询(Find/Get):查询元素所属集合。实际操作时,我们会使用一个点来代
阅读全文
摘要:栈数组 #include<stdio.h> #include<stdlib.h> #include<string.h> #define maxn 10000 //结点设计 typedef struct stack{ int data[maxn]; int top; }stack; //创建 stac
阅读全文
摘要:栈 栈的概念 在开始前,请牢记这句话:栈是一种先进后出的数据结构。 栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而操作也只能够进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说
阅读全文