
数据结构
文章平均质量分 84
数据结构
Yonggie
只写优质原创,坚决绝拒绝抄袭 | 研究员 | 广州大学 | 香港中文大学深圳FNii | pytorch_geometric(PyG)、FATE contributor
展开
-
简介Voronoi图Voronoi Diagrams
这是计算机的经典算法。原创 2024-11-04 22:47:36 · 481 阅读 · 0 评论 -
NP问题的通俗解释
图灵机有k条带子,左端有限,右端要多长可以有多长(潜在无限长)。每条带子都按顺序划分了格子,一个格子可以记录一个符号。符号的有限集我们称之为字母表(alphabet) . 每条带子上有一个带头(tape head),可以读取或更改一个格子里的内容。带头可以左右移动,我们规定图灵机的每个步骤中,带头只能向左一格、向右一格或不动。用最通俗的语言来解释,图灵机是运行在3条带子和寄存器上的符合规则的自动化的机器。原创 2023-07-12 16:30:46 · 483 阅读 · 0 评论 -
HDU 1114 完全背包的变式
这是给我自己看的,同志们我道个歉,我就不解释了……#include #include #include #include #include using namespace std;const int maxn=10010;const int inf=0x3f3f3f3f;//这是完全背包的变式,算的是装满背包但是要的是最小价值的东西。//技巧就是把dp数组一开始全部变成最大值,原创 2017-07-23 21:11:35 · 305 阅读 · 0 评论 -
HDU 2159 二维完全背包
建议同学先看看01背包,完全背包,多重背包和二维背包。学到的东西就是判别ans这个变量是否变化而判断有没有解。因为只是一个break不能跳出所有,是不能保证j是最优解的。AC代码#include #include #include #include #include using namespace std;const int maxn=110;const int inf=原创 2017-07-23 20:49:05 · 445 阅读 · 0 评论 -
HDU 1231 最大连续子序列和
这是动态规划的又一个经典问题。这个还不是纯裸的题,需要稍微处理一下。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>原创 2017-07-24 17:03:34 · 309 阅读 · 0 评论 -
01背包笔记 51nod1085
再次分析一下这个非常经典的动态规划吧~~ 首先用w[]数组存下每个的重量,v[]数组存下每个的价值,package表示背包的能装下的最大重量。这里我们把子状态参数设为背包重量和处理的物品序号数。 首先说一下递归做法。定义F(i,L)是背包容量为L,处理到第i个物品时背包中的最大价值。那么这个状态能从前哪几个状态得到呢?1.由于容量不够,没有拿第i个物品,从F( i-...原创 2018-10-24 22:31:40 · 217 阅读 · 0 评论 -
LeetCode 55. Jump Game
首先这是个动态规划的题……我竟然一开始用了dfs做……最后当然是time limit exceeded.你直接无脑dfs当然可以。贴下代码:#include <iostream> #include <cstring>#include <cstdio>#include <vector>using namespace std...原创 2018-11-02 22:28:55 · 289 阅读 · 0 评论 -
动态规划经典问题 最长上升子序列poj2533
这里我们拆分出的子问题不是n个数的最长公共子序列的长度,而是以sta[i]的值为结尾的最长公共子序列的长度。举个例子啊,比如1 6 1,n个数的最长公共子序列的长度是2(这个序列是1 6)(这也就是最终答案),而以sta[i]为结尾的最长公共子序列长度是1(这个序列是1)。 因为知道了这个以每个数结尾的公共子序列长度,n个、n-1个数、n-2的序列的最长公共子序列的长度也就能算出来了(原创 2017-08-23 19:41:59 · 324 阅读 · 0 评论 -
poj 2533 o(nlgn)做法
反正这个很奇妙,感觉不像是动态规划了……一个数组记录原来序列,一个数组记录长度为i的最长上升序列的结尾值是多少。因为查找的是时候是二分查找,所以平均复杂度由传统的O(n^2)变成了O(nlogn).AC代码:#include#include#include#includeusing namespace std;const int maxn=5e4+10;int num[原创 2017-08-23 22:32:57 · 346 阅读 · 0 评论 -
动态规划经典 最长公共子序列 poj1159
出处http://blog.youkuaiyun.com/v_july_v/article/details/6695482帮我稍微理解了这个思想。哎~我就是传说中的无脑儿啊!一个序列X,一个序列Y,X的下标用i,Y的下标用j,Xi表示从第一个元素到第i个元素的这个序列。Yj表示从第一个元素到第j个元素的序列。xi表示X序列的第i个元素,yj表示Y序列的第j个元素。我们把序列Xn转载 2017-08-24 11:37:57 · 356 阅读 · 0 评论 -
hdu 2955 背包问题的变形
还是许多像许多博客说的,这道题乍一看是普通的0 1背包。我们以为: 概率是背包容量cap,在银行能偷的钱是价值v,在银行被捕的概率是重量w,在不超过cap的情况下能偷到的钱数最多是多少。然而并不是这样。概率是一个浮点数,动态规划的dp数组用的是int类型,这样子很难转化。非要强行转化,要x100或者x1000吗?别开玩笑了。。。这里这个链接给我很大启发点击打开链接换一种思路:把这些银行能抢的...原创 2018-07-12 17:29:28 · 291 阅读 · 0 评论 -
动态规划 最大连续子序列
这个问题比较经典哈,就是一个数组内,求和最大的连续的子序列。有一个题可以看看, 呐,我们比较暴力的方法就是无脑for。这种方法是O(n^3)#include <iostream> #include <cstring>#include <vector>#include <cstdio>using namespace std...原创 2018-11-02 12:03:12 · 244 阅读 · 1 评论 -
动态规划的理解和例子集合
理解动态规划。它的基本思想是,大事化小,小事化了。把大的事件一步步分解成小的事件,再把边界值求出来,就可以通过递推来求出任何一个状态了。首先要想到的最重要的几点是:1.子问题重叠。2.局部最优就是整体最优。3.先前的决策不影响后续的决策。 第一个例子:小明上台阶这个问题没涉及到局部最优就是整体最优。那,问题很简单,小明可以一次上1个台阶也可以一次上2个台阶,问,他上到n...原创 2018-11-02 21:52:26 · 274 阅读 · 0 评论 -
codeforces 552C数制的转换,算是状态压缩吧
由于数据量实在太大,这个题没法用普通的枚举方式进行计算。其实题目就想是()+()+()=m+()+()+()满足这个东西罢了。那么我们可以简化一下,也就是要满足( ()+()+() )-( ()+()+() )=m,把大括号里的数看成一个数,那么就成了()-()=m这个东西了。那么我们来一下状态压缩。把这两个数想做两个有位置的w进制的串。我们最终要凑出m,为了方便,也为了对原创 2017-08-22 09:48:52 · 498 阅读 · 0 评论 -
二分图 poj 2536小问题而已。
二分图最大匹配,有点小注意就可以。这里gopher和hole就是二分图的两个集合了。但是两个集合之间的边不是它告诉你的,而是需要你自己判断两点之间有没有的。比较裸题了……希望我也能匹配到能温柔地牵着我的手一起走的女孩。跑题了哈哈。AC代码#include <iostream>#include <cstdio>#include <stri...原创 2017-08-13 14:27:10 · 289 阅读 · 0 评论 -
二分图 poj 1466 匈牙利算法呀~
仔细想了之后,这是求最大点独立集。可是数据给的比较麻烦,没有给女生多少个,男生多少个,二这两个数据是匈牙利算法必要的数据啊~AC代码:#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <cmath>...原创 2017-08-13 16:19:45 · 320 阅读 · 0 评论 -
hdu 1241 dfs简单题
我是真的发现“会者不难,难者不会”这句话是真的正确。我五分钟敲完代码一遍AC,可是我刚刚放弃的那道题做了一天都没做出来。好伤啊兄弟。一年以前我觉得dfs好难,现在看来像1+1==2差不多……时间啊时间,你让我头发掉了好多啊!思路:搜索到 ‘@’ 就把它所在的位置置为 ' * ',这也算是记录走过的路径。AC代码:#include <bits/stdc++.h&g...原创 2018-11-26 14:29:16 · 238 阅读 · 1 评论 -
一种经典的邻接表的实现和遍历方式
邻接表不和邻接矩阵只和点有若干联系,它和点与边都有密切的联系。邻接表的实现需要四个东西,一个是记录边信息的数组、一个是表头、一个是当前操作边的序号、一个是add函数。(当然也少不了初始化函数了)具体如下。int which=1;int head[maxv];struct EDGE{ int d,w,next; EDGE():next(-1){}}e[maxv];原创 2017-08-06 13:39:20 · 819 阅读 · 0 评论 -
PTA 07-图6 旅游规划 (25 分)
这道题我用dijstra算法,对这个算法稍微做改进就可以。可以说非常经典了!算法的思想我不必详述,毕竟大家在学习《数据结构》的时候都已经非常了解了。读我的代码要注意的细节:1.我储存图的时候节点编号从1开始。2.邻接矩阵储存的图。3.初始化时把每个节点初始化成最远距离。#include <iostream>#include <algorit...原创 2019-05-17 18:08:25 · 867 阅读 · 0 评论 -
二分图 poj 1325 挺好的转化。
这个要求是每一项任务都要有一个机器来完成的。算是个模板题吧。我们可以这样想。A机器的所有工作模式是一个集合,B机器的所有工作模式是一个集合。把任务看成是边,一端连着A的某一种模式,一端连着B的某一种模式。(因为某个任务可以由A的某种模式完成,也可以由B的某种模式完成。)因为我们想把所有的任务都做完,那就要求每一条边都至少有一个点与其相连。即最小点覆盖集。 怎么求?上...原创 2017-08-12 21:49:09 · 275 阅读 · 0 评论 -
BFS poj 3948 简单bfs,注意打印路径的方法
#include <bits/stdc++.h>using namespace std;const int maxn=10;const int dir[4] [2]={1,0,0,1,-1,0,0,-1};struct p{ int a,b; p(int A,int B):a(A),b(B){} p(){}};int maze[maxn][maxn];que...原创 2018-12-08 14:32:35 · 344 阅读 · 0 评论 -
补一下我曾经拉下的东西——dfs
一个典型的例子就是输出1-n的全排列,这里也谢谢我们的启蒙书——《啊哈算法》。很惭愧大一时候没有认真学习这个东西。深度优先搜索的模型就是这样的:void dfs(int step){ //判断边界 //尝试每一种可能,一般用for循环 //继续下一步 dfs(step+1); //返回下面贴一下自己写的代码:给自己看而已啦~#inc原创 2017-08-19 10:13:49 · 356 阅读 · 0 评论 -
二分图 HDU 2444 判断是否是二分图以及二分最大匹配
这个问题有几个要注意的地方。第一个是黑白染色,留个模板好了,这里我用的是比较好看但效率比较低的dfs。第二个问题是ans要不要除以2,这个问题我一开始和另一道题poj 1466混了些。回到正题,这个问题的思路是,首先,用dfs黑白染色判断这个图是不是二分图,如果不是,输出no,如果是,就输出最大匹配数。这里的ans是不用除以2的,而poj 1466这个问题是要除以2的。...原创 2017-08-15 16:55:46 · 356 阅读 · 0 评论 -
图解Kosaraju算法 求有向图强连通分量
原创 2019-05-15 08:48:39 · 543 阅读 · 0 评论 -
拓扑排序 基于DFS、Kahn 两种算法图解过程
原创 2019-05-15 08:46:28 · 780 阅读 · 3 评论 -
BFS hdu 2612 bfs
妈的我一开始理解错题意了。bfs肯定没错。一开始傻了吧唧的把每个kfc都作为终点遍历一遍,找出来花费最小的那个。TLE。我以为花费是两个人中最后到达的花费,原来花费是两个人走路的总花费。其实他说的不清楚。第一次的(是错的,不用看,给我自己看的。):#include <iostream>#include <cstring>#include <...原创 2018-11-21 16:55:00 · 134 阅读 · 0 评论 -
dfs基础,补上我拉下的。
感谢啊哈磊的启蒙。完成啊哈磊的 1-9数,填入九个框,满足 哐哐哐+哐哐哐=哐哐哐。经典的dfs#include #include #include #include using namespace std;const int maxn=1e3+10;const int inf=0x3f3f3f3f;int vis[maxn];int ans[maxn];void原创 2017-08-19 13:58:53 · 283 阅读 · 0 评论 -
二分图 poj 1486 匹配是否唯一
这个题啊……一开始竟然读错题意了5555人家说把能够唯一确定的所有匹配给输出出来,而不是整体的匹配唯一才输出。也就是说,你可能一共有6个文件6个标志,但是唯一确定的匹配有4个,还有两个不能确定,这样你要输出4个而不是输出none……哎……不是wa在方法上而是wa在细节上啊、方法:先求一边最大匹配,然后暴力枚举删掉每一个匹配到的边,然后在求最大匹配,如果最大匹配数和原来没删边的数...原创 2017-08-15 11:39:55 · 542 阅读 · 0 评论 -
codeforces 850C dfs
我用邻接表储存的,dfs遍历了这棵树,求得解。AC代码:#include #include #include #include #include using namespace std;const int maxv=1e5+10;const int maxe=1e5+10;const int inf=0x3f3f3f3f;int head[2*maxv];struct原创 2017-08-19 17:07:57 · 520 阅读 · 0 评论 -
kruskal 的经典写法 通畅工程之类的题目的模板 最小生成树
主要是给编码看一下这种风格。主要用了并查集和克鲁斯卡尔最小生成树的算法。#include <iostream>#include <algorithm>#include<cstdio>#include <stack> #include <fstream> #include <cstring>#include...原创 2019-05-17 20:25:41 · 164 阅读 · 0 评论 -
二分图: HDU1498 & poj3041
1A,这个是poj3041的升级版,做法很简单,而且很暴力哈哈哈,具体方法下面介绍。AC代码:#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <cstring>#include <vector>...原创 2017-08-16 11:46:37 · 297 阅读 · 0 评论 -
poj 2488 DFS
其实就是典型的dfs了,不用剪枝,不用优化。只不过要注意一点,就是字典序要最小。字母小数组小的优先去搜。AC代码:#include <iostream> #include <cstring>#include <vector>#include <cstdio>using namespace std;const int max...原创 2018-11-13 19:56:11 · 160 阅读 · 0 评论 -
UVA 10020 区间相交问题系列之二
这道题是裸题了。。问题是这样:给定数轴上一定范围,再给你一些区间,求用最少的区间全部覆盖这个给定范围。原创 2017-07-30 21:06:51 · 421 阅读 · 0 评论 -
UVA 1193 区间相交问题系列之一的另一种说法
例题UVA1193问题简化为:我们在数轴上有很多个区间,让你求这么一个东西,用尽可能少的点覆盖掉所有的区间(一个点能覆盖含这个点的所有区间),求出用多少个点。步骤:1.区间右值进行排序。2.维护一个边界值,每增加一个点,就更新这个边界值。3.输出点的个数。本题一个岛屿就对应着一个区间,安放雷达就是安放点。AC代码:#include #include原创 2017-07-30 16:58:08 · 448 阅读 · 0 评论 -
HDU 2037 区间相交问题系列之一
这个问题可以简化成这个样子。我们有好多个区间,让你尽可能的选出尽量多的不重复的区间。这是贪心思想经典的区间相交问题的一种。解决这种问题方法比较简单。1.以右端点位基准,对区间进行排序。2.只要下一个区间不与前面的区间相交,就要着,否则就不要。3.维护一个界限。要具体的解释的话,找找别人的博客吧~ac代码如下#include #include #i原创 2017-07-20 16:36:45 · 350 阅读 · 0 评论 -
给定前序遍历、中序遍历重建二叉树
前言如此经典的问题,不想讲思路了。我哔哩哔哩上有视频讲解,可以观看.然后我这个代码不是给acm人员用的,并不能做到短小精悍也做不到快且效率。只是个平常的C++实现。思路通过讲解呢我们会很明显的感到这是一个递归的问题。从一个序列划分成了两个序列,然后各自再做划分直到只有单个元素为止。那最简单的实现思路就是递归了。实现思路的讲解在这里,也是哔哩哔哩上的。实现起来有个点要注意一下,那就是子...原创 2020-04-21 11:00:20 · 302 阅读 · 0 评论 -
求得任意树的宽度 LeetCode662. Maximum Width of Binary Tree
这个问题适用求出不知宽度的树的度(或者说宽度)。思路在哪里呢?记录每一层的最左端节点的下标L,用同一层的节点坐标减 L 能求出宽度,然后取每层宽度的最大值就可以了。Java:(其实什么语言思路都一样) int max = 0; public int widthOfBinaryTree(TreeNode root) { helper(r...原创 2019-05-05 12:22:45 · 187 阅读 · 0 评论 -
LeetCode 655. Print Binary Tree 格式问题
主要是想记录一下这个在遍历的时候也可以做其他动作的操作。这题鬼畜的输出方式真是醉了。。那么怎么做呢?先找出深度,再通过深度算出宽度,怎么确定这些节点的位置?你看看下面Format这个方法,一边遍历一边改。先算出深度宽度,然后做一个规模是 深度*宽度 全是 "" 的矩阵,在遍历的时候修改矩阵。/** * Definition for a binary tree...原创 2019-05-05 14:25:29 · 193 阅读 · 0 评论 -
poj1258 最小生成树裸题 给个模板看就行了
直接给你邻接矩阵,一定是稠密图,所以优先选择pirm。然后AC代码:#include #include #include #include #include using namespace std;const int maxn=1e3+10;const int inf=0x3f3f3f3f;int mp[maxn][maxn];int dis[maxn];int N;原创 2017-08-10 19:01:17 · 372 阅读 · 2 评论 -
判断一棵二叉树是否是完全二叉树
当然我们可以手画出来然后看啦!但是数据多了怎么办?打代码吧。回顾一下特点,什么是完全二叉树?每一层的节点都集中在左边。只要有一个不和左边的队伍站在一起那么它就不是完全的。它有这个特点那我们用层序遍历。思路:在链式存储结构里,叶子结点的左右孩子都是null,这是我们想用的很重要的一点。我们先对这课树一直做层序遍历,直到我们遍历到底层有空指针的地方。此时把整个队列里按序把...原创 2019-05-10 11:57:27 · 1178 阅读 · 0 评论