
ACM_数据结构
并查集、最短路之类
长颜草
无话可说
展开
-
HDU 6319 Ascending Rating【单调队列】
题目链接题目意思有一个长度为n的序列,现在给出你序列的前k个数和一个递推公式,让你计算序列的所有值。然后现在划分一个长度为m的连续区间,问你所画的所有区间中最大值异或i的和值,和区间中最大值变化次数异或i的和值。解题思路大白话这题的关键就在于求一个序列的最大值和最大值变化的次数,我们就会想到用单调队列,用单调队列维护,我们将数列倒过来去维护一个递减的单调队列,这样队头元素就...原创 2018-07-31 10:56:19 · 189 阅读 · 0 评论 -
PAT L2-011 玩转二叉树
题目链接题目意思给出你一棵二叉树的中序遍历和前序遍历,现在让你将这个树做一个反转然后输出层次遍历的序列。所谓反转就是将非叶子节点的左右孩子对换。解题思路这道题和之前的那道这是《二叉搜索树吗?》很像,就是数据结构中的二叉树遍历。我们先根据所给出的序列将二叉树构造出来,然后用广搜进行搜索输出。注意的是我们要先搜索右子树再搜索左子树。代码部分#include <io...原创 2018-03-05 20:13:02 · 195 阅读 · 0 评论 -
PAT L2-004 这是二叉搜索树吗?
题目链接题目意思给你一个整数n,接着给你n个整数 ,现在让你判断所给的数是否是一棵二叉搜索树的前序序列或者是其镜像。解题思路根据二叉搜索树的性质,肯定能用根将二叉树分为左右两个部分,否则就不是标准的前序序列。 镜像二叉树其实就是左小右大倒过来判断。代码部分#include <iostream>#include <stdio.h>...原创 2018-03-01 16:56:57 · 446 阅读 · 0 评论 -
计蒜客 合并数字【栈】
题目链接解题思路我们利用栈一边输入一边判断,如果两数之间相差1,就往后输入,或者将栈顶元素输出,接着去栈中找前边的元素接着比较就行了。代码部分#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include &l...原创 2018-03-26 20:11:54 · 263 阅读 · 0 评论 -
HDU 6325 Interstellar Travel【凸包】
题目链接Problem Description After trying hard for many years, Little Q has finally received an astronaut license. To celebrate the fact, he intends to buy himself a spaceship and make an interst...原创 2018-08-03 19:53:49 · 277 阅读 · 0 评论 -
HDU 6318 Swaps and Inversions【归并排序】
题目链接题目意思现在有一个n个数值的无序序列,现在要求这个序列中的逆序对个数,并且每个逆序对需要支付x元。但是那你可以耍一个小把戏就是支付y元将这个序列中相邻的两个数值交换。现在问你你需要的最小支付是多少元。解题思路题目意思就是问你一个序列中有多少个逆序对。我们如果支付y元将两个相邻的数值进行交换,那么就消除了一个逆序对,和直接算逆序对的个数是相同的意思。那么问题就在于怎样才能有最...原创 2018-07-28 09:59:18 · 235 阅读 · 0 评论 -
HDU 2112 HDU Today
题目链接题目意思给你n个车站,接着是n条路线,现在要从起点到终点,问最短距离是多少。解题思路这就是一道简单的最短路问题,唯一的问题就在于这道题的输入的是一个地名而不是以前经常写的数字,其实这个做个简单的处理就行。我们用map来将地名映射成数字,就变成了一道原来常做的最短路问题。代码部分#include <iostream>#include <stdio.h>#include <string.h原创 2017-10-16 21:09:34 · 186 阅读 · 0 评论 -
HDU 1869 六度分离
题目链接题目意思给你N个人,编号从0~N-1,接着的M行给你A和B的关系,现在让你判断是否两个人之间最多隔6个人可以让两个人相互联系。解题思路将两个人之间的距离定为1,那么用Floyd跑一遍,如果两个人之间的最短路大于7,那么就是两个人之间最少相隔了七个人,那么定理不存在。代码部分#include <iostream>#include <stdio.h>#include <string.h>原创 2017-10-11 21:16:04 · 269 阅读 · 0 评论 -
HDU 1874 畅通工程续
题目链接题目意思有n个城镇,编号为0~n-1,m条道路,从一个城镇到另一个城镇有多条路,现在问你从一个城镇到另一个城镇的最短距离是多少。如果没有路就输出-1。解题思路这就是一道简单的最短路问题,用Floyd算法或dijkstra算法都行。其中要注意的是,城镇之间的路是双向的,下边刷数组的时候要刷双向的。代码部分#include <iostream>#include <stdio.h>#incl原创 2017-10-10 21:18:50 · 220 阅读 · 0 评论 -
HDU 3790 最短路径问题
题目链接题目意思给你n个点,m条无向边,现在要从一个城市到另一个城市,要求最短路,如果最短路径有多条,就选花费最小的那条路。解题思路这道题就是在模板题上稍微做一下修改即可,就是在判断最短路的时候如果最短路相同,就再判断一下最小花费即可。代码部分#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#原创 2017-10-11 21:07:30 · 236 阅读 · 0 评论 -
最短路详解
在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径叫作最短路径或者最短距离。对于带权的图,考虑路径上各边的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或带权路径长度。从原创 2017-08-15 09:49:22 · 1026 阅读 · 0 评论 -
HDU 2066 一个人的旅行
题目链接题目意思给你T条路,现在小草要从S个与他相邻的城市出发,去D个目的地中的一个,要你求到达目的地的最短时间。解题思路这就一道用dijkstra的最短路的题。这道题中的坑点就是小草到他相邻的城市的距离是0。用dijkstra跑一遍就出答案啦!代码部分#include <iostream>#include <stdio.h>#include <string.h>#include <math原创 2017-10-11 20:43:33 · 206 阅读 · 0 评论 -
PAT L2-001 紧急救援【最短路径变形】
题目链接题目意思给出你四个整数N,M,S,D,分别表示有N个城市,城市标号从0~(n-1),连接M条路。接下来给你N个数代表第几个城市有多少救援队,接下来的M行给出你三个数a ,b, l 分别代表从城市a到城市b距离l。现在要你输出总共有几条最短路径且最短路径上的最多的救援队的数量,并且输出拥有最多的救援队的路径。解题思路这是一道用dijstra 算法求最短路的题目。不过题目不但原创 2018-01-29 22:11:34 · 400 阅读 · 0 评论 -
HDU_1599 find the mincost route
题目链接题目意思给你n个景区,求经过最小三个景区形成的环的最小花费。解题思路这是一道求最短路的题,用Floyd算法,Floyd本身只是比较暴力的dp求各点之前的最短路径。但是,在Floyd更新的过程中也是有顺序的。可以借助这一点来解决这个题目。首先先说一下如何来确定环的花费最小。开始先将ans赋值为无穷大。然后我们可以先选取两个点,两点之间的最短路径为dis[i][j],再找一个大于i,j的一个点k原创 2017-07-24 09:02:57 · 325 阅读 · 0 评论 -
HDU 2923 Einbahnstrasse
题目链接题目意思给你三个数,N,C,R分别代表N个地点,C辆车和M条路,已知这M条路有单向的也有双向的,现在给你一个起点和C个终点,要你求从起点开始走到终点再走回的最短距离。解题思路由于路有双向的有单向的,所以去的路与返回的路径不一定相同,所以就求起点到终点的最短距离加上终点的起点的最短距离就好了,跑一遍最短路就行。要注意的是数据的输入时字符串,要记得处理一下。代码部分#include <iost原创 2017-10-15 16:32:30 · 224 阅读 · 0 评论 -
HDU 1596 find the safest road
题目链接题目意思给你n个城市,接着是n*n的矩阵,记录着城市到城市之间道路的安全系数。安全系数为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 。现在给你q个询问,接着给出你两个城市,让你输出这两个城市之间最安全的道路的安全系数。解题思路这相当于一道Dijkstra的模板题,只要稍微灵活运用就行。要求最安全的道路就是要算安全系数最大的道路。代码部分#incl原创 2017-10-11 10:27:27 · 214 阅读 · 0 评论 -
HDU 2680 Choose the best route
题目链接题目意思给你三个数N,M,S分别代表N个车站,M条路和终点S。然后给你一个W,接着W个数表示出发点,现在要求的是从起点开始到终点的最短距离。解题思路这道题和之前的那道一个人的旅行那道题很像,我们将起点统一看成0,然后只要将那W个出发点到0的距离定为0,那么这道题就转化成立一道普通的最短路问题,就用dijkstra写就好。代码部分#include <iostream>#include <s原创 2017-10-15 17:03:36 · 200 阅读 · 0 评论 -
HDU 6070 Dirt Ratio
题目链接题目意思给出n个数,求任意区间【left,right】的AC率中最小的那个值。 区间AC率=distinct【left,right】/(right-left+1) distinct的中文意思是唯一的,特殊的,表示区间【left,right】中不同数字的个数解题思路我们求AC率,它无非就是0~1之间的一个数字,因此采用二分答案的方法求解。 现在假设答案为mid,则 distinct【le原创 2017-08-08 10:31:29 · 271 阅读 · 0 评论 -
HDU 1754 I Hate It【线段树】
题目链接题目意思给你n个学生的成绩然后m个询问,Q时询问学生A到B的最高成绩,U时将A学生的成绩改为B解题思路一道简单的线段树题,具体的看代码吧!代码部分#include <iostream>#include <stdio.h>#include <string.h>#define lchild left,mid,root<<1#define rchild mid+1,right,root<原创 2017-09-13 18:18:13 · 238 阅读 · 0 评论 -
HDU 6315 Naive Operations【线段树】
题目链接题目意思初始a数组为0,给你一个b数组,q次询问add x y为a数组区间x y增加1,query x y查询区间x~y中a[i]/b[i]向下取正的和值。解题思路区间查询问题,我们首先想到的就是线段树。 我们用sum数组去维护区间的和值,由于分母是固定的,那么就维护一个数组sub[root]=min(b[i]-a[i]%b[i])的值。这样如果sub[root]...原创 2018-07-28 15:39:22 · 147 阅读 · 0 评论 -
HDU 2795 Billboard【线段树】
题目链接题目意思有一块h*w的广告牌,现在要往上边贴广告,所贴广告的高度都为1,要求所贴的广告尽量往上和往左贴,如果可以贴,输出你所帖广告的行号,否则输出“-1”。解题思路这道题用线段树来解。我们以广告牌的高度作为标准来构造线段树,另外用一个数组来存储线段树每个节点的宽度。贴广告的时候我们从左子树往右子树来贴,这样就是从上往下来贴的。具体过程看代码吧!代码部分#include <iostream>原创 2017-07-24 11:50:34 · 224 阅读 · 0 评论 -
HDU 1166 敌兵布阵【线段树】
题目链接题目意思给定一个序列,有三种操作,最后输出给定范围的值之和题目意思数据大,普通方法肯定超时,用线段树来计算区间的加法。代码部分#include <iostream>#include <stdio.h>#include <string.h>#define lchild left,mid,root<<1#define rchild mid+1,right,root<<1|1using原创 2017-07-24 19:28:43 · 366 阅读 · 0 评论 -
HDU 2489 Minimal Ratio Tree【最小生成树】
题目链接题目意思给你n个节点,接着给出你这n个节点的权值,然后给出你节点之间连接的边的权值,现在给你一个数m,让你求包含m个节点的Ratio的最小值,其中Ratio就等于m个点的边权值之和比上节点权值和。解题思路这道题给出的节点数比较少,所以可以用深搜结合最小生成树来解。将所有的节点搜一遍,选出Ratio值最小的一个即可。用最小生成树求Ratio的值,在对每个点进行一次深搜,看该点选还是不选。代码原创 2017-10-28 20:33:48 · 229 阅读 · 0 评论 -
HDU 1875 畅通工程再续
题目链接题目意思给你n个小岛,现在给出你这n个小岛的坐标,如果两小岛之间的距离在10~1000之间就可以建桥,建桥的费用为100元/米。现在让你求要将所有的小岛连通的最小花费。解题思路这就是一道最小生成树的题,不过是求出坐标之间的距离算最小生成树,然后再乘以花费即可。但是要注意用kruskal算法时的控制结束条件,点数比较多,控制不好就会超时。。。。代码部分#include <iostream>原创 2017-10-28 20:19:53 · 205 阅读 · 0 评论 -
最小生成树——Kruskal算法
算法背景克鲁斯卡尔(Kruskal)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。Kruskal算法是由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。算法过程库鲁斯卡尔(Kruskal)算法是基于贪心的思想得到的。首原创 2017-07-20 10:33:26 · 1172 阅读 · 0 评论 -
HDU 1102 Constructing Roads【最小生成树】
题目链接题目意思给你n个村庄,再给你每个村庄之间的距离,现在给你Q条路。现在要将所有的村庄连通,问最短还要修多长的路。解题思路这就是一道简单的最小生成树问题。不过用kruskal算法写的时候,要注意判断所有村庄都联通是的结束条件,因为这一点的问题,我还内存超了还几次呢。。。。代码部分 kruskal算法#include <iostream>#include <stdio.h>#inclu原创 2017-10-28 20:44:01 · 261 阅读 · 0 评论 -
HDU 1233 还是畅通工程【最小生成树】
Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的原创 2017-07-21 11:19:19 · 236 阅读 · 0 评论 -
最小生成树——Prim算法
最小生成树 给定一个无向带权图,顶点数是n,要使图连通只需(n-1)条边,若这(n-1)条边的权值和最小,则称这n个顶点和(n-1)条边构成了图的最小生成树。Prime算法算法背景 普里姆算法(Prim算法)是一种构造性算法。该算法于1930年有捷克数学家沃伊捷赫.亚尔尼克发现,并在1957年由美国计算机科学家罗伯特.普里姆独立发现,1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合原创 2017-07-19 19:25:06 · 2630 阅读 · 2 评论 -
HDU 4009 Transfer water【最小树形图】
题目链接题目意思小A住在一个村庄,去年洪水淹没了这个村庄。因此他们决定将整个村庄搬到附近的山上。山上没有泉水,因此每一家必须选择打一个井或者从别的人家引水。如果一家决定去挖一口井,则他们打井的费用是他们房子的高度,X每米。如果决定去引水,如果引水的地方比当前地方高,则引水的钱是这两家的距离成上Y美元每米。如果引水的地方比当前低。则必须需要水泵(除了引水线后)还要花费Z美元买一个水泵。除此之外,村民原创 2017-11-02 19:46:44 · 252 阅读 · 0 评论 -
HDU 1863 畅通工程【最小生成树】
题目链接题目意思给你n条边和m个城镇,城镇编号为1~m。现在要你求连通所有城镇的最小花费。如果不能连通就输出“?”。解题思路其实这就是一个简单的最小生成树的问题。我们可以用kruskal来写。注意我们要判断能不能形成通路,加一个标记变量。判断能不能形成回路即可。代码部分#include <iostream>#include <stdio.h>#include <string.h>#includ原创 2017-08-14 09:39:19 · 287 阅读 · 0 评论 -
HDU 5253 连接的管道 【最小生成树】
题目链接解题思路这就是一道简单的最小生成树的模板题。只要向左向右去走就行。代码部分#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>using namespace std;int maps[1010][1010];int pre[1010*1010]原创 2017-11-02 19:25:18 · 301 阅读 · 0 评论 -
HDU 1879 继续畅通工程【最小生成树】
题目链接题目意思给你n个城镇,城镇序号从1~n,现在要使这n个城镇相连。每组数据给你两个城镇的编号,和修这条路的成本,还有这条路的状态,0表示没修,1表示修好。现在要你求让城镇相连的最小的修路花费。解题思路其实这就是一个最小生成树的问题。我们找到一棵最小生成树。这里需要注意的是两个城镇之间可能路已经修好,那么我们就要有一个操作就是把已经存在道路的两个城镇之间的花费改为0。具体实现看代码吧!代码部分#原创 2017-08-14 08:50:43 · 299 阅读 · 0 评论 -
PAT L2-010 排座位【并查集】
题目链接题目意思安排宴席座位,现在问你任意两个人能否安排同席。这里假设朋友的朋友也是朋友,敌人的敌人不一定是敌人,也不一定是朋友,只有单纯直接敌对关系的人才是绝对不能同席的。解题思路这就是一道并查集的问题,我们将不是单纯敌对关系的人连成一棵树,最后看两个人是否在同一棵树上即可。代码部分#include <iostream>#include <...原创 2018-03-05 19:54:29 · 243 阅读 · 0 评论 -
HDU 1198 Farm Irrigation【并查集+枚举】
题目链接代码部分#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <math.h>#define ll long longusing name...原创 2018-03-14 20:52:23 · 157 阅读 · 0 评论 -
HDU 1232 畅通工程【并查集】
Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1原创 2017-07-17 15:48:32 · 275 阅读 · 0 评论 -
并查集详解
并查集支持查找一个元素所属的集合以及合并两个元素各自所属的集合等运算。它主要用于处理一些不相交的集合的合并问题。一些常见的用途有求连通子图、求最小生成树的Kruskal算法和求最近公共祖先(Least Common Ancestors, LCA)等。并查集的数据结构记录了一组分离的动态集合 S={ S1,S2, …,Sk }。每个集合通过一个“代表”加以识别。“代表”即该集合中的某个元素,“代表”的原创 2017-07-17 15:31:21 · 399 阅读 · 0 评论