算法
文章平均质量分 51
可惜浅灰
Linux、C/C++
展开
-
哈希表应用:POJ1840 公式
题目描述:Consider equations having the following form:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0The coefficients are given integers from the interval [-50,50].It is consider a solution a system (x1, x2, x3, x4, x5) that verifies the equation, xi∈[-50,50], xi !=原创 2021-09-30 13:50:21 · 254 阅读 · 0 评论 -
二分搜索应用:POJ1759 花环
题目描述:The New Year garland consists of N lamps attached to a common wire that hangs down on the ends to which outermost lamps are affixed. The wire sags under the weight of lamp in a particular way: each lamp is hanging at the height that is 1 millimeter原创 2021-09-30 13:22:09 · 150 阅读 · 0 评论 -
二分法穷举的一般格式
题目中需要找最大值: 需要尽量向上靠拢,判定成功后提高下界,int low = 0, high = max;int ans = 0;while (high >= low){ int mid = (high + low) / 2; if (Judge(mid)) { ans = mid; low = mid + 1; } else { high = mid - 1; }...原创 2021-09-30 10:46:30 · 334 阅读 · 0 评论 -
二分搜索应用:POJ3258
题目描述:Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement takes place on a long, straight river with a rock at the start and another rock at the e...原创 2021-09-30 10:37:28 · 83 阅读 · 0 评论 -
找关键路径:SDUTOJ2498 AOE网上的关键路径
题目描述:一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。 AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG。与AOV不同,活动都表示在了边上,如下图所示:如上所示,共有11项活动(11条边),9个事件(9个顶点)。整个工程只有一个开始点和一个完成点。即只有一个入度为零的点(源点)和只有一个出度为零的点(汇点)。 关键路径:是从开始点到完成点的最长路径的长度。路径的长度是边上活动耗费的时间。如上...原创 2021-09-28 10:19:57 · 162 阅读 · 0 评论 -
拓扑排序:POJ2367 家族树
题目描述:The system of Martians' blood relations is confusing enough. Actually, Martians bud when they want and where they want. They gather together in different groups, so that a Martian can have one parent as well as ten. Nobody will be surprised ...原创 2021-09-27 10:23:59 · 105 阅读 · 0 评论 -
拓扑排序算法
算法步骤: 1、遍历所有结点,找出入度为0的结点作为源点输出; 2、在图中删除源点作为弧尾的有向边; 3、重复1和2,直到不存在入度为0的阶段; 4、若输出的点数小于结点总数说明图中有环,无法得到完整的拓扑序列,只能输出有确定先后关系的那一部分序列。代码实现:#include <iostream>#include <stack>using namespace std;#define maxn ...原创 2021-09-26 20:59:44 · 216 阅读 · 0 评论 -
结点间来回最短距离:POJ3268 银牛聚会
题目描述:One cow from each ofNfarms (1 ≤N≤ 1000) conveniently numbered 1..Nis going to attend the big cow party to be held at farm #X(1 ≤X≤N). A total ofM(1 ≤M≤ 100,000) unidirectional (one-way roads connects pairs of farms; roadirequi...原创 2021-09-26 10:06:55 · 86 阅读 · 0 评论 -
判负环:POJ3259 虫洞
题目描述:While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each o...原创 2021-09-25 10:54:38 · 86 阅读 · 0 评论 -
SPFA算法:判断负环
算法同利用SPFA算法求单源点最短路径一致SPFA算法:找单源点最短距离_可惜浅灰的博客-CSDN博客再此基础上增加了sum数组,用于统计各个结点的入队次数,只要发现有结点的出队次数不小于结点总数,则有负环;反之,若算法函数运行结束后仍然没有结点的入队次数不小于结点总数,则没有负环。代码实现:#include <iostream>#include <queue>using namespace std;#define maxn 100int n, m;.原创 2021-09-25 10:15:57 · 442 阅读 · 0 评论 -
SPFA算法:找单源点最短距离
SPFA算法: Dijkstra算法的改进版,整体思想同Dijkstra算法一致。1、保存一个带权有向图 使用链式前向星保存一个有向图class Edge{public: int to; int weight; int next;};Edge e[maxn << 1];void InsertEdge(int u, int v, int w) { e[++cnt].to = v; e[cnt].next = head[u];...原创 2021-09-24 21:08:48 · 135 阅读 · 0 评论 -
有向图中判正环:POJ1860 货币交换
题目描述:Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can be several points specializing in the sa...原创 2021-09-24 18:08:45 · 88 阅读 · 0 评论 -
Bellman-Ford算法:有向图中判负环
1、有向图的存储:用边集数组存储一个有向图class Edge{public: int u; int v; int weight;};Edge edge[maxn << 1];void InsertEdge(int u, int v, int w){ edge[++cnt].u = u; edge[cnt].v = v; edge[cnt].weight = w;}void CreateGraph()...原创 2021-09-24 14:03:59 · 1234 阅读 · 0 评论 -
Dijkstra算法应用:POJ1797 重型运输
题目描述:BackgroundHugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to t...原创 2021-09-24 11:14:23 · 286 阅读 · 0 评论 -
Floyd算法:各顶点之间最短路径
非常简单,利用插点法,在边的两个顶点之间插入一个新结点,看是否能够缩短原来两结点之间的距离。代码实现:#include <iostream>using namespace std;#define maxn 100#define max_value 0x3f3f3f3fint dist[maxn][maxn], p[maxn][maxn];class Graph{public: int edge[maxn][maxn]; int ve...原创 2021-09-23 09:33:13 · 245 阅读 · 0 评论 -
Dijkstra算法:找单源点最短路径
Dijkstra算法: 把所有结点划分成连个集合V和V-S、S中是已经找到最短距离的结点集合、V-S是暂时还没有找到最短距离的结合,初始时S中只有源点,每次在V-S中找出距离S中距离最小的结点t,将其加入S集合,同时更新V-S中结点到S的最短距离,直到V-S为空,得到图中所有结点距离源点的最短距离。1、保存一个带权有向图用邻接矩阵存储一个有向图,若有u到v有边,则edge[u][v]记录权值,否则将其记录为无穷大class Graph{pu...原创 2021-09-22 17:16:14 · 300 阅读 · 0 评论 -
有向图中强连通分量缩点:POJ2553 图的底部
问题描述:We will use the following (standard) definitions from graph theory. LetVbe a nonempty and finite set, its elements being called vertices (or nodes). LetEbe a subset of the Cartesian productV×V, its elements being called edges. ThenG=(V...原创 2021-09-22 15:15:51 · 85 阅读 · 0 评论 -
统计无向图中割点的个数:POJ1144 网络
题目描述:A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N . No two places have the same number. The lines are bidirectional and always connect together t...原创 2021-09-22 12:43:59 · 103 阅读 · 0 评论 -
Tarjan算法应用:统计有向图中的强连通分量
有向图中的强连通分量是指,任何两个顶点都能相互到达的子图。有向图中的Tarjan算法步骤:1、构建一个有向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点传入函数,初始时:dfn = low = 次序, 3、将根节点入栈并标记; 4、遍历邻接点,若邻接点未被访问,递归,递归后更新low值;若邻接点已经访问且在栈中,说明之间有有...原创 2021-09-21 13:52:43 · 134 阅读 · 0 评论 -
Tarjan算法应用:统计无向图中的连通分量
连通分量是指在无向图中,任意两个顶点能互相到达的极大连通子图,再填任一结点就不能互相连通。 Tarjan算法步骤: 1、构建一个无向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点和其父结点(根节点的父结点设为他自己)传入函数,初始时:dfn = low = 次序; 3、遍历邻接点,若邻接点时它父亲,什么都不做;若邻接点未被访问,递归,递归后更新...原创 2021-09-21 10:42:25 · 904 阅读 · 0 评论 -
Tarjan算法应用:无向图找割点
无向图中的割点是指去掉一个结点后,分裂成两个或更多互不相通的子图,这个结点称为割点。Tarjan算法步骤: 1、构建一个无向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点和其父结点(根节点的父结点设为他自己)传入函数,初始时:dfn = low = 次序; 3、遍历邻接点,若邻接点时它父亲,什么都不做;若邻接点未被访问,递归,递归后更新low值;若邻接点已经访问...原创 2021-09-20 10:40:13 · 225 阅读 · 0 评论 -
Tarjan算法应用:无向图找桥
无向图中的桥是指去掉一条无向边后,分裂成两个互不相通的子图,这条无向边称为桥。Tarjan算法步骤: 1、构建一个无向图;一个时间戳数组dfn[],表示遍历的次序;一个回溯点数组low[],表示能通过非父子边回溯到的最早结点遍历序号; 2、将一个根节点和其父结点(根节点的父结点设为一个无效值)传入函数,初始时:dfn = low = 次序; 3、遍历邻接点,若邻接点时它父亲,什么都不做;若邻接点未被访问,递归,递归后更新low值;若邻...原创 2021-09-19 16:29:12 · 782 阅读 · 0 评论 -
一条路径遍历整张图:POJ2488 一个骑士的旅行
题目描述:The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journeyaround the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The ...原创 2021-09-19 15:17:53 · 120 阅读 · 0 评论 -
图的连通区域划分:UVA572 油田
题目大意:输入多个m行n列的矩阵,用0表示输入结束。找出有多少块石油区域,用“@”代表石油,假如两个“@”在横,竖或对角线上相邻,就说它们位于同一区域,对于每个输入,输出一个数表示有几个石油区域。输入样例:1 1*3 5*@*@***@***@*@*1 8@@****@*5 5****@*@@*@*@**@@@@*@@@**@0 0输出样例:0122解题思路: 类似于找图中的连通分量个数,把矩阵看成图,八个方...原创 2021-09-19 10:51:06 · 167 阅读 · 0 评论 -
BFS应用:UVA1599 理想路径
题目描述:给定一个n个点m条边的无向图,每条边上都涂有1种颜色。求点1到点n的一条路径,使得经过的边数最少,在此前提下,经过边的颜色序列最小。可能有自环与重边。输入保证至少存在一条连接1和n的道路。输入:输入共m+1行第一行2个整数:n和m。以后m行,每行空格隔开的3个整数ai,bi,ci,表示在ai,bi之间有一条颜色为ci的道路。输出:输出共两行第一行1个正整数k,表示1到n至少需要经过k条边。第二行包含k个空格隔开的正整数,表示从1到n依次经过的边的颜色。原创 2021-09-17 20:43:33 · 219 阅读 · 0 评论 -
BFS应用:POJ3278 抓牛
题目描述:Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a pointN(0 ≤N≤ 100,000) on a number line and the cow is at a pointK(0 ≤K≤ 100,000) on the same number line. Farmer John has two ...原创 2021-09-17 15:54:11 · 98 阅读 · 0 评论 -
bitset容器应用:洛谷 P2881 排奶牛
题目描述:Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate, and FJ would like to order his cows according to these rates from the fastest milk producer to the slowest.FJ has already compared the milk output rate for M原创 2021-09-15 15:22:58 · 171 阅读 · 1 评论 -
反向建图的妙用:P3916 图的遍历
题目描述:给出N个点,M条边的有向图,对于每个点v,求A(v)表示从点v出发,能到达的编号最大的点。输入:第1 行,2 个整数N,M。接下来M行,每行2个整数Ui、Vi,表示边(Ui,Vi)。点用1,2,⋯,N编号。输出:N 个整数A(1),A(2),⋯,A(N)。输入样例:4 31 22 44 3输出样例:4 4 3 4解题思路: 求图中各结点能到达的最大结点,正向思路的话可以循环正向遍历结点,定义一个最大值变量记录该结点能到达的...原创 2021-09-15 10:26:54 · 170 阅读 · 0 评论 -
树的最小带权路径问题:百练4080 哈夫曼编码树
题目描述:Construct an expanded binary tree with nexternal nodes, each external node Ki related to a weight Wi, which minimizes thesum of the external path length of leaf: Min( W1 * L1 + W2 * L2 + W3 * L3 + … + Wn * Ln)Wi: the weight of each nodeLi: the pat原创 2021-09-13 10:16:55 · 306 阅读 · 0 评论 -
哈夫曼编码压缩比问题:POJ1521 熵
题目描述:An entropy encoder is a data encoding method that achieves lossless data compression by encoding a message with "wasted" or "extra" information removed. In other words, entropy encoding removes information that was not necessary in the first place t原创 2021-09-13 11:26:04 · 626 阅读 · 0 评论 -
树的最小带权路径问题:POJ3253 修篱笆
题目描述:Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needsN(1 ≤N≤ 20,000) planks of wood, each having some integer lengthLi(1 ≤Li≤ 50,000) units. He then purchases a single long ...原创 2021-09-13 10:38:44 · 250 阅读 · 0 评论 -
二叉树找最近公共祖先:洛谷 P3884 二叉树问题
题目描述:如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:深度:4 宽度:4(同一层最多结点个数)结点间距离: ⑧→⑥为8 (3×2+2=8)⑥→⑦为3 (1×2+1=3)注:结点间距离的定义:由结点向根方向(上行方向)时的边数×2,与由根向叶结点方向(下行方向)时的边数之和。输入:输入文件第一行为一个整数n(1≤n≤100),表示二叉树结点个数。接下来的n-1行,表示从结点x到结点y(约定根结点为1),最后一行两个整数u、v,表示求从结点u到结点v的距离。输...原创 2021-09-10 20:34:15 · 117 阅读 · 0 评论 -
二叉树综合:UVA548 树
题目描述:输入一个二叉树的中序和后序遍历,请你输出一个叶子节点,该叶子节点到根的数值总和最小,且这个叶子是编号最小的那个。 输入: 您的程序将从输入文件中读取两行(直到文件结尾)。第一行是树的中序遍历值序列,第二行是树的后序遍历值序列。所有值将不同,大于零且小于或等于10000.二叉树的节1<=N<=10000。 输出: 对于每个树描述,您应该输出最小值路径的叶节点的值。存在多路径最小的情况下,您应该选择终端叶子节点上具有最小值的那条路径,且输出那个最小值的终端叶子。输入样例:3原创 2021-09-10 17:02:36 · 170 阅读 · 2 评论 -
二叉树遍历序列知二求一:UVA536 二叉树重建
注:知二求一必须有中序遍历序列题目描述: 输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。解题思路: 1、考察根据两个遍历序列的二叉树的重建,三步走即可:前序找根、中序分左右、递归还原; 2、根据题意,对树只有输出结点操作,完全没有必要生成结点重新构建树,只需要在递归的过程中按照后序遍历的顺序左右根,把输出根放在递归左右子树之后即可。代码实现:#include <iostream>using namespace std;...原创 2021-09-09 14:24:49 · 98 阅读 · 0 评论 -
构建二叉树:洛谷P1305 新二叉树
题目描述:输入一串二叉树,输出其前序遍历。输入:第一行为二叉树的节点数n。(1≤n≤26)后面n行,每一个字母为节点,后两个字母分别为其左右儿子。空节点用*表示输出:二叉树的前序遍历。案例:输入:6abcbdicj*d**i**j** 输出:abdicj解题思路:1、每次只知道树的一小部分,而且在操作中每次出现的结点没有固定规律,必须有在树中对结点的查找操作,所以要用数组 存储这棵二叉树;建立两个数...原创 2021-09-09 09:25:08 · 199 阅读 · 0 评论 -
排序函数sort()应用:UVA642 单词查找
题目描述:在美国各地的数百万份报纸中,有一款名为Jumble的文字游戏。 这个游戏是要解决一个谜语,但为了找到答案中出现的字母来解读四个字是必要的。 你的任务是编写一个可以解读单词的程序。输入:输入文件包含4个部分: 1、字典,由至少一个,最多100个字组成,每行一个; 2、包含′XXXXXX′的行,表示字典的结尾; 3、一个或多个你必须解读的混乱的“单词”,每个单词都在一条线上; 4、包含'XXXXXX'的另一行,它表示文件的结尾。 所有单词,包括字典单词和加扰单词,仅由小写英语组成字母,长度至少原创 2021-09-08 10:11:32 · 127 阅读 · 0 评论 -
string应用:UVA401 回文串与镜像串
题目描述:输入是一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字00。所谓回文串,就是反转以后和原串相同,如abbaabba和madammadam。所谓镜像串,就是左右镜像之后和原串相同,如2S2S和3AIAE3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题中,每个合法字符的镜像如下表所示:Character ReverseA AE 3H HI IJ ...原创 2021-09-07 11:00:14 · 252 阅读 · 0 评论 -
改版KMP算法:洛谷P3375 KMP字符串匹配
题目描述:给出两个字符串s1和s2,若s1的区间[l,r]子串与s2完全相同,则称s2在s1中出现了,其出现位置为l。现在请你求出s2在s1中所有出现的位置。定义一个字符串s的 border 为s的一个非s本身的子串t,满足t既是s的前缀,又是s的后缀。对于s2,你还需要求出对于其每个前缀s′的最长 bordert′的长度。输入:第一行为一个字符串,即为s1;第二行为一个字符串,即为s2。输出...原创 2021-09-06 20:27:55 · 129 阅读 · 0 评论 -
环形字符串处理:UVA1584 环状序列
题目描述:长度为n的环状串有n种表示法,分别为从某个位置开始顺时针得到的。在环状串的所有表示法中,字典序最小的称为“最小表示”。输入一个长度为nn的环状DNA串(只包含A,C,G,T这四种字符)的一种表示法,你的任务是输出该环状串的最小表示。解题思路:对于环形序列有两种处理方式: 方式1:把序列s复制一份,与原序列首尾相连,拉长为一个直线串,如 环状序列ATC -> 直线序列ATCATC;或者也可以去复制一份去掉尾元素后,与原序列首尾相连,如 环状序列 AT...原创 2021-09-06 13:46:56 · 1347 阅读 · 0 评论 -
C++版模式匹配KMP算法
字符串的KMP算法用于找父串中子串最先出现处首元素的位置。 1、定义两个变量i和j,分别作为在父串和子串中要比对字符的自然序; 2、与BF算法相同:若父串i处元素和子串j处元素相等,i和j都后移。但若匹配不成功,只有j回 退。 与BF算法相比,KMP算法有两个特点:i不回退;j回退的位置需要单独求出,这是KMP算法的关键。求j回退的位置: 1、建立数组go_back[],其中go_back[j]为j要回退的位置; 2.采用动态规划来求解go_back...原创 2021-09-05 16:05:50 · 175 阅读 · 0 评论