
算法
山川き
这个作者很懒,什么都没留下…
展开
-
图的m着色问题
1.问题 图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。 2.解析 图着色问题描述为: 给定无向连通图G=(V, E)和正整数m,求最小的整数m,使得用m种颜色对G中的顶点着色.使得任意两个相邻顶点着色不同。这个问题是图的m可着色判定问题。 若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问原创 2021-05-31 20:05:48 · 415 阅读 · 0 评论 -
构造最优前缀的贪心算法
构造最优前缀的贪心算法 1.问题 构造最优前缀的贪心算法,即哈夫曼算法(Huffman) 2.解析 我们可以用一个数据结构维护所有数字的最小两个值,每次取最小的两个值就是序列,把这两个值累加到结果上,那么结果就是WPL 3.设计 priority_queue<int,vector<int>,greater<int> >cmp; for(int i=0 ; i<n; ++i){ int x; scanf("%d",&x)原创 2021-05-25 22:26:17 · 166 阅读 · 0 评论 -
装载问题(0-1背包问题)
1.问题 整数规划问题,0-1 背包问题 2.解析 思路:轻者先装,直到再装任何集装箱将使轮船载重量超过 C 时停止 定理:对于任何正整数 k,算法(轻者先装)对 k 个集装箱的实例得到 最优解。 3.设计 for(int i = 0; i < n; i++){ for(int j = 0; j < m; ++j){ if(j >= w[i]){ dp[j] = max(dp[j], dp[j - w[i]] + v[i]); } } } 4.分析 O(nlogn) 5.源码 01背包原创 2021-05-17 16:28:41 · 144 阅读 · 0 评论 -
LCS算法和背包算法
1.问题 LCS算法和背包算法,特别要求举例时采用不同于讲义的数据进行推导。 2.解析 Xi=<x1,x2,…,xi> Yj=<y1,y2,…,yj> Zk=<z1,z2,…,zk> 如果Zk是Xi和Yj的最长公共子序列 (1)xi = yj,那么zk = xi = yj,Zk-1是Xi-1和Yj-1的最长公共子序列 (2)xi ≠ yj,那么zk ≠ xi,Zk-1是Xi-1和Yj的最长公共子序列 (3)xi ≠ yj,那么zk ≠ yi,Zk-1是Xi和Yj-1的最长原创 2021-05-10 23:25:55 · 148 阅读 · 0 评论 -
动态链乘法
1.问题 设A1,A2,…An为n个矩阵的序列,其中Ai为Pi-1×Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,…,Pn>给出 给定向量P,确定一种乘法次序,使得基本运算的总次数达到最小 例如P=<40,20,30,50>,则A1:40×20,A2:20×30,A3:30×50 (1) (A1A2)A3=40×20×30+40×30×50=84000 (2)A1(A2A3)=40×20×50+20×30×50=190000 2.解析 蛮力法 枚举所有可能的乘法次序,针对每种次原创 2021-04-26 21:11:52 · 327 阅读 · 0 评论 -
投资问题
1.问题 设m 万元钱,n 项投资,函数 fi(x)表示将 x 万元投入第 i 项项目所产 生的效益,i=1,2,…,n.问:如何分配这 m 元钱,使得投资的总效益最高? 2.解析 设Fk(x)表示x万元投给前k个项目的最大效益,k=1,2,…,n, x=1,2,…,m。 设给第k个项目投资xk万元,故投资给前k-1的项目资金为(x-xk)万元 递推方程:Fk(x)=max{ fk(xk)+ Fk-1(x-xk)},k=2,3,…,n 边界条件:F1=f1(x),Fk(0)=0,k=1,2,…,n 3.原创 2021-04-25 18:57:42 · 97 阅读 · 0 评论 -
特定分治策略
1.问题 选第 k 小元素:特定分治策略。 2.解析 3.设计 int select(int a[],int n , int k){ int cnt=n/5; if(n<=6){ sort(a,a+n,cmpx); return a[k-1]; } else{ int b[m],c[m],d[m]; int j=0,t=0; for(int i= 0 ; i<n ;++i){原创 2021-04-19 17:27:37 · 96 阅读 · 0 评论 -
最近对问题
1.问题 最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点。假设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面的n个点。 2.解析 1.暴力算法,遍历每一个点对的距离求出最小值 2.分治算法,根据中位点二分左右区间得到最短距离,然后对区间[mid - d, mid + d]求最短距离,两值取小,不断递归。 对于最近对问题最容易最直接想到的就是蛮力算法,我们可以得到每两个点的距离求最小值,但这样的时间复杂度较高。我们可以采用分治的想法解决这一问题,将复杂难问题转化为简单问原创 2021-04-12 17:05:59 · 273 阅读 · 0 评论 -
二分归并排序
二分归并排序 1.问题 二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。 2.解析 二分归并排序是经典的分治算法,分而治之,将长度为n的数组不断划分成n/2的子数组,即将n规模的问题转化成为了n/2规模的子问题,不断划分,当问题规模为1时(长度为1的数组本身就是有序的),将每一个长度为1的子序列进行归并,不断归并就能够实现将长度为n/2的数组归并得到长度为n的数组,实现排序。 3.设计 void merge(int a[],int left ,int middle,int rig原创 2021-03-29 15:58:07 · 133 阅读 · 0 评论 -
查找算法
1.问题 写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。 2.解析 暴力查找:for循环遍历完一次数组 二分查找:每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为0 3.设计 暴力查找: int find(int n,int m){ int ans=0; for(int i=0;i<n;++i){原创 2021-03-22 15:56:43 · 115 阅读 · 0 评论 -
用Floyd、Dijkstra算法求解下图各个顶点的最短距离
1.问题 用Floyd、Dijkstra算法求解下图各个顶点的最短距离 2.解析 Floyd算法: 设顶点集为v,边集为u 初始化:D[u,v]=A[u,v] For k:=1 to n For i:=1 to n For j:=1 to n If D[i,j]>D[i,k]+D[k,j] Then D[i,j]:=D[i,k]+D[k,j]; c) 算法结束:D即为所有点对的最短距离矩阵 Dijkstra算法: 1.通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。原创 2021-03-15 16:31:24 · 267 阅读 · 0 评论 -
Kruskal算法构造最小生成树
1.问题 举一个实例,画出采用Kruskal算法构造最小生成树的过程。 2.解析 已知图V = {…} 我们构造一棵最小生成树T 第一步:随意选取起点 第二步:将所有边按权值从小到大的顺序排序 第三步:按顺序遍历每条边(不能构成回路),直到所有节点都被遍历了。 实例: 图V如下图所示 ① 将每条边按权值从小到大进行排序: AB BC AD BD DE CE(3 3 4 5 6 7) 选取AB(3) 此时被选中的点:A B ② 接下来是BC(3) 此时被选中的点:A B C ③ 接下来是AD(4) 此时原创 2021-03-10 10:52:00 · 564 阅读 · 0 评论 -
Prim算法构造最小生成树
Prim算法 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。 1.问题 举一个实例,画出采用Prim算法构造最小生成树的过程。 2.解析 已知图V = {…} 我们构造一棵最小生成树T 第一步:随意选取起点 第二步:在前一步的基础上寻找最小权值 第三步:继续寻找最小权值,之后以此类推,直到遍历完所有的节点。 实例: 图v如图 1.任意选择一个点 这里我们选择A点 从A点出发有两条路,一条通向B(权值为3),一条通向D(权值为4) 我们选择权值较小的点B 此时被选中的点:A原创 2021-03-08 20:23:42 · 4850 阅读 · 0 评论