
算法
一壶烈酒可慰风尘
这个作者很懒,什么都没留下…
展开
-
二叉树的深度优先遍历 (前序 中序 后序)
深度优先遍历主要依靠递归实现,初学递归,研究二叉树的遍历顺序有助于加深对递归的理解。例:*注意对比代码顺序1.前序:public void deep_search(TreeNode root) { if(root==null) return; System.out.printf("%4d",root.val); deep_search(root.left); deep_search(root.right); return; }输出:2.中序: public v原创 2020-08-12 12:42:34 · 1179 阅读 · 0 评论 -
C/C++回溯法-作业调度问题
问题描述:n个作业(1,2,…,n)要在两台机器上处理,每个作业必须先由机器1处理,然后再由机器2处理,机器1处理作业i所需时间为a1,机器2处理作业i所需时间为bj(1<=i<=n),批处理作业调度问题要求确定这n个作业的最优处理顺序,使得从第1个作业在机器1上处理开始,到最后一个作业在机器2上处理结束所需时间最少。例:作业-机器时间关系表为约束条件:当前作业的执行时间和必须小于之前已选择序列时间和的最小值解图:图中limit为限制条件,real为完成当前作业执行时间和,当rea原创 2020-06-07 20:27:43 · 2311 阅读 · 0 评论 -
C/C++回溯法-哈密顿回路问题
问题描述:为方便分析问题,我们对一个简单些的图进行分析:条件约束:1.加入路径的节点与前一个加入路径的顶点一定是连通的;2.加入路径的最后一个顶点和第一个顶点一定是连通的;3.路径上不能出现重复的顶点。完整代码:#include<stdio.h>#include<malloc.h>#define max_v 20 //最大顶点数 typedef struct Node //顶点 { int v; Node *next;}Node;in原创 2020-05-24 22:36:54 · 5183 阅读 · 4 评论 -
C/C++回溯法-图着色问题
问题描述:给定无向连通图G=(V,E)和正整数m,求最小的整数m,使得用m种颜色对G中的顶点着色,使得任意两个相邻顶点着色不同。约束条件:相邻顶点着色不同对第k+1个顶点进行着色,若与该顶点相连的且已着色顶点的着色与该顶点的着色不同,则着色成功,若着所有颜色都不满足约束条件,则返回第k个节点,重复上述过程,对其重新着色。例:若只有1,2,3三种色号完整代码:#include<stdio.h>void gc(){ int n; printf("请输入节点数:");原创 2020-05-23 15:28:32 · 6027 阅读 · 0 评论 -
C/C++回溯法-素数环问题
问题描述:把整数{1,2,…,n}填写到一个环中,要求每个数只填写一次,并且相邻两数之和为素数。约束条件:1.与已经填写到素数环中的整数不重复;2.与前面相邻的整数之和是素数;3.最后一个填写的整数与第一个填写的整数之和为素数。在填写第k个整数时,如果满足上述约束条件,则继续填写第k+1个位置;如果1~n个数都无法填写到第k个位置,则取消对第k个位置的填写,回溯到第k-1个位置。完整代码(实现一):#include<stdio.h>#include<math.h>t原创 2020-05-22 21:45:22 · 2959 阅读 · 1 评论 -
C/C++分支限界法-作业调度问题
问题描述:给定n个作业集合J={J1,J2,…,Jn},每个作业都有3项任务分别在3台机器上完成,作业Ji需要机器j的处理时间为tij(1<=i<=n,1<=j<=3),每个作业必须要先有机器1处理,再由机器2处理,最后由机器3处理。批处理作业调度问题要求确定这n个作业的最优处理顺序,使得从第一个作业再机器1上处理开始,到最后一个作业再机器3上处理结束所需的时间最少。例:作业-机器矩阵为问题示例:这些任务的一个执行序列为:1.确定上界,这些任务的一个随机执行顺序即可作为原创 2020-05-21 17:25:09 · 8790 阅读 · 10 评论 -
C/C++分支限界法-任务分配问题
问题描述:任务分配问题要求把n个任务分配给n个人,每个人完成每项任务的成本不同,要求分配总成本最小的分配方案。例: 任务分配矩阵如下1.取每行最小值作为目标函数下界,即down=2+3+1+4=10;用贪心算法选取目标函数上界,即up=2+3+5+4=14。2.确定目标函数:lb=已分配任务员工总成本+未分配员工最小成本之和3.分配到第三个员工即可初步判断最优解,若总成本不大于目标函数值,则该成本为最优解,否则可通过更新上界进一步缩小搜索最优解范围。图解:本题采用优先队列解,图中序号为出原创 2020-05-19 11:38:42 · 12945 阅读 · 12 评论 -
C/C++分支限界法-0/1背包问题
问题描述:给定n种物品和一个容量为W的背包,物品i的重量是wi,其价值是vi,对每种物品i只有两种选择:装入背包或不装入背包,如何选择装入背包的物品,使得装入背包物品总价值最大?例:假设有四个物品,其重量分别为4、7、5、3,价值分别为40、42、25、12,背包的容量W=10。1.对四个物品按性价比从大到小排序为:2.用贪心算法确定下界,down=40;将最大性价比塞满背包的理想情况作为上界,即up=10*10=100;目标函数ub=当前装入背包物品总价值+下一个物品填满背包的价值当装入第n原创 2020-05-18 20:58:53 · 11209 阅读 · 5 评论 -
C/C++分支限界法求多段图最短路径问题
多段图的最短路径问题是求原点到终点的最小代价路径分支限界法求解步骤:1.确定合理的限界函数,根据限界函数确定目标函数的界[down,up]2.从起点开始,按照广度优先策略搜索问题的解空间树,将在界范围内的节点加入PT表3.从PT表中取出节点做拓展节点,重复第二步,直到找出最优解下面我们引入一个实际例子:根据求解步骤进行分析:1.由此图我们容易想到一个简单的下界,从起点出发取两段之间路径最小值,直到到达终点,即down=2+4+5+3=14。通常我们可以使用贪心法求上界,即up=2+6+6+3原创 2020-05-17 12:07:13 · 6308 阅读 · 4 评论