![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
山川き
这个作者很懒,什么都没留下…
展开
-
图的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 · 345 阅读 · 0 评论 -
构造最优前缀的贪心算法
构造最优前缀的贪心算法1.问题构造最优前缀的贪心算法,即哈夫曼算法(Huffman)2.解析我们可以用一个数据结构维护所有数字的最小两个值,每次取最小的两个值就是序列,把这两个值累加到结果上,那么结果就是WPL3.设计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 · 125 阅读 · 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 · 114 阅读 · 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 · 106 阅读 · 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=1900002.解析蛮力法枚举所有可能的乘法次序,针对每种次原创 2021-04-26 21:11:52 · 234 阅读 · 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,…,n3.原创 2021-04-25 18:57:42 · 75 阅读 · 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 · 58 阅读 · 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 · 247 阅读 · 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 · 107 阅读 · 0 评论 -
查找算法
1.问题写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。2.解析暴力查找:for循环遍历完一次数组二分查找:每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为03.设计暴力查找:int find(int n,int m){ int ans=0; for(int i=0;i<n;++i){原创 2021-03-22 15:56:43 · 74 阅读 · 0 评论 -
用Floyd、Dijkstra算法求解下图各个顶点的最短距离
1.问题用Floyd、Dijkstra算法求解下图各个顶点的最短距离2.解析Floyd算法:设顶点集为v,边集为u初始化:D[u,v]=A[u,v]For k:=1 to nFor i:=1 to nFor j:=1 to nIf D[i,j]>D[i,k]+D[k,j] ThenD[i,j]:=D[i,k]+D[k,j];c) 算法结束:D即为所有点对的最短距离矩阵Dijkstra算法:1.通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。原创 2021-03-15 16:31:24 · 219 阅读 · 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 · 531 阅读 · 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 · 4673 阅读 · 0 评论