搜索与图论
文章平均质量分 53
345345
x-d-xxh
这个作者很懒,什么都没留下…
展开
-
L2-031 深入虎穴 (25 分)
L2-031 深入虎穴 (25 分)原题连接题意找最深层的叶子节点思路根据题意,第i行的点的父节点是i,那么就可以根据这种方案建图。每行的数都是i的子节点。坑点需要手动找一遍没有出现过的点做头结点代码#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;vector<int> g[N];int res[N];void dfs(int u, int cnt)//当前在那个点,当原创 2022-04-20 14:46:20 · 306 阅读 · 0 评论 -
方格分割【dfs】
题面思路dfs分割路径因为要分割出两个一模一样的图形来,所以路径肯定会经过(3, 3)这个点,且两边路径也一定对称。所以就从(3, 3)开始dfs,把当前它走过的点标记为走过,再把另一边对称边也标记为走过,这样就可以事项同时两边走了。一旦走到边界答案就+1最后答案需要除以4,因为对称的两部分会有重复。代码#include <bits/stdc++.h>using namespace std;const int N = 10;int g[N][N];int ans = 0原创 2022-04-19 21:16:44 · 195 阅读 · 0 评论 -
题目 1463: 蓝桥杯基础练习VIP-Sine之舞【递归】
原题链接题面题目题目描述最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。不妨设An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)Sn=(…(A1+n)A2+n-1)A3+…+2)An+1FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。输入仅有一个数:N<201。输出请输出相应的表达式Sn,以一个换原创 2022-04-06 14:48:21 · 121 阅读 · 0 评论 -
题目 2217: 蓝桥杯算法训练-递归求二项式系数值
原题链接题面题目题目描述输入一个满足题目要求的输入范例。输出与样例输入对应的输出。样例输入3 10样例输出120思路类似斐波那契数列,定义n, k,然后每次进行(k,n−1),(k−1,n−1)(k, n - 1),(k - 1, n - 1)(k,n−1),(k−1,n−1),边界条件是k==0∣∣k==nk == 0 || k == nk==0∣∣k==n一旦遇到边界,结果+1.代码#include<bits/stdc++.h>using namespa原创 2022-04-06 13:45:21 · 116 阅读 · 0 评论 -
abc239_e Subtree K-th Max(dfs,贪心优化)
原题链接题目大意N个数,q个询问接下来一行n个数:x_i表示第i个点的权值是x_i接下来n - 1行,每行两个数a b,表示a和b之间有一条边接下来q行,每行两个数a,b,问以a为根节点的子树中所有节点权值的第b大是多少。2≤N≤1052≤N≤10^52≤N≤1050≤Xi≤1090≤X_i≤10^90≤Xi≤1091≤Ai,Bi≤N1≤A _i ,B_i ≤N1≤Ai,Bi≤N1≤Q≤1051≤Q≤10^51≤Q≤1051≤Vi≤N1≤V_i≤N1≤Vi≤N1≤Ki≤201≤原创 2022-02-20 01:38:46 · 810 阅读 · 0 评论 -
小沙的长路(图论,欧拉图)
https://ac.nowcoder.com/acm/contest/23477/E最小路我是根据画图推出来的,就是把每三条相邻的边都划成最短的,可以发现最短路永远是 n−1n - 1n−1,然后根据定义得,欧拉图要么全是偶点,要么有两个奇点,可以发现,当n为奇数时,该完全图每个点都是偶点,所以可以走全;当为偶数时,每个点都是奇点,至少需要删掉几条边使这个图只具有两个奇点,那就是减去 n/2−1n/2-1n/2−1。然后完全图得总边数是n∗(n−1)/2n * (n - 1) / 2n∗(n−1)/2,原创 2022-02-16 21:45:37 · 397 阅读 · 0 评论 -
CF1581B Diameter of Graph(思维,构造,树)
原题链接题意给 nnn 个点,mmm 条边,要求你这样构成一个无向连通图,使任意两点之间的最短距离小于 k−1k - 1k−1。思路分类讨论。小于 k−1k - 1k−1 实际上就是 小于等于 k−2k-2k−2。如果 n == 1,m == 0 时是 YES,同时还要满足 k>=2k >= 2k>=2,因为距离如果小于 000 的话,就不合理了。要想构成一个无向连通图,那么边数至少需要 n−1n-1n−1 条, 可以发现有 n−1n-1n−1 条边时,任意两点最短距原创 2022-01-25 16:48:41 · 298 阅读 · 0 评论 -
CF1559C Mocha and Hiking(图,思维,构造)
原题链接题意输入一个数 nnn ,代表有 n+1n + 1n+1 个点,然后 1−(n−1)1 - (n - 1)1−(n−1),每个点都有一条边连向自己后面那条边。然后对于点 1−n1 - n1−n,到点 n+1n + 1n+1, 有 nnn 个数如果 ai==0a_i == 0ai==0 ,代表有一条边从 iii 连向 n+1n + 1n+1如果 ai==1a_i == 1ai==1 ,代表有一条边从 n+1n + 1n+1 连向 iii思路第一种情况如果 a1==1a_1 =原创 2022-01-21 17:22:27 · 310 阅读 · 0 评论 -
CF920A Water The Garden (BFS水题)
原题链接题目思路直接 BFS 即可,把所有状态放进去,这里初始化了所有状态为 1 ,也就是说已经把自己本身给灌溉了,然后 BFS 扩展每个可以扩展的点放进去,能扩展就扩展,然后标记一下,左后取最大值即可,因为可以扩展时一定时间会变长,不可以扩展时,时间也不会变长了,所以直接取最大值,然后输出答案。注意向左扩展时不能是负数。代码#include<bits/stdc++.h>using namespace std;const int N = 2500;bool st[N];in原创 2022-01-18 15:26:32 · 415 阅读 · 0 评论 -
P2802 回家(bfs + 贪心思维)
原题链接题目思路看到求最短这种和数据范围 n<=9n <= 9n<=9 首先就要想到 BFSBFSBFS.然后没走一步需要看下一步是否越界血量够不够(当血量为 0 时就直接死亡了,所以血量必须维持在 1 以上,否则即使是血量为 0时到家了,也会死在家门口)本题还有一个坑点,就是他可能不能直接走回家,有可能会要走重复的路(需要去捡一个鼠标再回来),所以本题的难点 就在于如何判重,通过传统的 bool 数组判重肯定不行,那么就想,对于每个格子,一定是以更优的状态到它才有重原创 2022-01-18 14:44:50 · 618 阅读 · 0 评论 -
木棍游戏(牛客月赛)dfs
原题链接题目思路数据很小,直接 dfsdfsdfs 爆搜。然后枚举每一根木棍放在每一个位置的情况。代码#include<bits/stdc++.h> using namespace std;const int N = 100;double a[N];double ans = -1;double helen(double a,double b,double c){ double p = (a + b + c) / 2; double s = sqrt(原创 2022-01-17 19:52:35 · 2458 阅读 · 0 评论 -
全体集合(牛客xb月赛)
原题链接题目思路先开始推出了点之间的距离是偶数就一定有解的结论。但是因为不太会二分图,然后赛时一时心急大意没看数据范围,加上概念不清,以为没有自环就是没有环,就是一颗树,然后推出了点之间距离为偶数一定有解,否则 NO。可是实际上,如果有环,且是奇环的话,那么就肯定是 YES,因为点可以通过这个奇环来改变距离的奇偶性,肯定有解。代码#include<bits/stdc++.h> using namespace std;const int N = 5e5 + 10;vect原创 2022-01-14 00:33:17 · 234 阅读 · 0 评论 -
水洼计数 Lake Counting(挑战程序设计竞赛)
原题链接题意代码/*W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.*/#include<bits/stdc++.h>using namespace std;const int N = 200;int n, m;char g[N][N];bool st[N][N]原创 2022-01-08 17:01:42 · 382 阅读 · 0 评论 -
P5194 [USACO05DEC]Scales S
思路其实还是一知半解用前缀和优化的DFS先做个前缀和然后每次找一个数,如果这个数前面所有的数加上这个数都可以取,就直接取不行的话就在这个数的前面找数,然后判断能否全部取走,能取走就取走,然后得到最大值,然后最终是用不可以取走所有前面的情况下在从前面重新开始枚举。还不太懂,但要是可以把这题搞懂,对搜索水平会有很大的提升!代码#include<bits/stdc++.h>#define int long longusing namespace std;int n, c;c.原创 2022-01-04 11:30:24 · 385 阅读 · 0 评论 -
Kitchen Plates (拓扑排序)
原题链接题意给五个关系像"A<B"这种,问根据这些关系,问这些关系是否有矛盾,有矛盾的话就输出“impossible”,没有的话尽量从小到大输出这些东西。思路直接拓扑排序即可,输出拓扑序列。代码#include<bits/stdc++.h>using namespace std;const int N = 10005;vector<int> g[N], ans;int d[N];int n = 5;bool topsort(){ queue&l原创 2021-12-27 15:46:25 · 318 阅读 · 0 评论 -
Dwarf Tower(spfa)
原题链接题意先给了n个数,告诉你制作第i件物品物品需要 aia_iai 元,然后给m个关系,每行a, b, c,表示第a件物品可以用第bc件物品合成,问最后合成第一件物品要多少元?思路设一个虚拟点,一开始给的n个数就是每个点到虚拟点的距离,然后给的是点之间的关系,比如a,b,c,a = b + c,可以理解为 c点到a点的距离为b,b点到a点的距离为a,ok,就按这种办法建图,最后要求的是点1的距离,跑spfa即可。注意点要用文件输入freopen("dwarf.in", "r", s原创 2021-12-27 14:24:50 · 149 阅读 · 0 评论 -
Just Multiplicative Inverse Gym - 102875J
原题链接题意给一个素数 nnn ,问 i=[1,n−1]i = [1 , n - 1]i=[1,n−1],做几次操作 iii 可以变成1,操作是 i=n mod ii = n\ mod\ ii=n mod i,且它本身也算一次操作,用所有i变成1的总次数除以 n−1n - 1n−1,结果保留十位小数。思路一开始虽然也有想到要记下来,因为一些数是重复出现的,但是没有想到要用记忆化搜索,因为一直以来都不太会写记忆化搜索。后来去把记忆化搜索重学了一遍,发现这题其原创 2021-12-24 13:46:27 · 310 阅读 · 0 评论 -
Altruistic Amphibians (dfs)
原题链接思路每关一盏灯,我们就标记一下,dfs时,我们只搜可以到达终点和终点的点,如果搜到小精灵,则立刻返回,说明只要关闭这盏灯就可以有小精灵逃出去了。详情看代码注释代码#include <bits/stdc++.h> using namespace std;const int N = 550;int n, m, k;int flag[N][N]; //标记小精灵位置int safe[N][N];//标记点是否可以到达终点 int light[N][N];//标记关灯位置原创 2021-12-23 14:59:20 · 239 阅读 · 0 评论 -
Brexit (搜索)
原题链接题意思路很普通的搜索,和拓扑排序很像。先把要走的点放进队列,然后和它相连的点度数-1,如果一个点的度数小于他原本的两倍,就把它放入队列,继续用它去更新和它相连的点代码#include<bits/stdc++.h>using namespace std;const int N = 2e6 + 10;vector<int> g[N * 2];bool st[N * 2]; //n个国家,m个关系,我的祖国编号,第一个离开的编号 int n, m, x,原创 2021-12-22 18:45:14 · 792 阅读 · 0 评论 -
Beautiful Now (BFS暴力)
原题链接题意意思就是,交换K次以内两位数,找出一个最大值和一个最小值思路对于最大值和最小值分开来求,分别跑一遍BFS,一个取最大值,一个取最小值。为了方便,可以用字符串的字典序来比大小,效果和数字比大小相同。然后搜索时,我们用类似冒泡排序的方式进行求max时,当s[i] < s[j]时,再把字符串放进队列求min时,当s[i] > s[j]时,再把字符串放进队列不然的话,也没有意义。同时在放入队列时,还要判断第一个字符是不是0,如果是0也不能放入队列。因为题目要求不能有前原创 2021-12-22 10:54:56 · 327 阅读 · 0 评论 -
Buggy Robot(Dijkstra + DP)
原题链接参考题意思路dp思路 + dijkstradp:d[i][j][k]d[i][j][k]d[i][j][k] 表示用前k步时走到 (i,k)(i,k)(i,k) ,最小的修改次数,下面公式给的都只是一个大概意思,可以这样理解,实际上用优先队列版的Dijkstra时需要写成if判断的形式,判断最小值是否更新再放进队列。添一步走: d[x + xx[i]][y + yy[i]][k] = min ( d[x原创 2021-12-20 15:59:45 · 388 阅读 · 0 评论 -
C - Graph Isomorphism
原题链接题意给两个图,问两个图相不相等思路通过全排列,以原图作为下标,然后每种新排列去原图中对应,看和要对比的图一不一样,一样就输出Yes,都不一样就No.坑点无向图,要存两条边。代码#include<bits/stdc++.h>using namespace std;const int N = 10;int n, m;int a[N];int flag[N][N];int End[N][N];int main(){ cin >> n >>原创 2021-12-19 22:18:34 · 444 阅读 · 0 评论 -
火凤燎原 -牛客月赛
原题链接题意蒲公英:度数大于三(中心点)且有一个点有子节点(链)(链的长度不限)。问有几个本质不同的蒲公英?本质不同: 中心点不同或者链不同。思路存储一下每个点的度数,当遍历到一个点的度数大于等于3时,在这个图所有的点中,除了这个中心点和所有和它相连的点外,剩下的点有几个就有几个蒲公英。代码正确#include<bits/stdc++.h>//#define int long longusing namespace std;int read() { in原创 2021-12-17 22:11:32 · 83 阅读 · 0 评论 -
Meteor Shower POJ - 3669
原题链接题意四个方向(上下左右),给n个爆炸点, 会影响四个方向的点,问从(0, 0)开始,最少几步可以走到安全地带。思路宽搜, 去重,走到安全地带就返回距离,注意对于每个爆炸点和受影响的点,要取最小值(以最近的一次爆炸为准)。还要注意原点就走不了的情况代码#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <stdio.h原创 2021-12-16 21:02:11 · 216 阅读 · 0 评论 -
Luggage Lock
原题链接题意给一个锁,每次可以选择连续的一段拨动一次,给定一个初始状态,再给定一个目标状态,问从初始状态转到目标状态需要几步?思路问最短几步首先想到BFSBFSBFS可以求最短路的特性。然后我们看从初始状态到目标状态,需要怎么转,就用a[i]−b[i]a[i] - b[i]a[i]−b[i],得到给定初始到目标的转法,然后我们可以把它转换成从0000到目标状态,也就是说把负数+10+ 10+10,其实一起(含正数) +10+ 10+10也可以,%10\%10%10就可以了。现在问题就变成了从00原创 2021-12-15 22:01:15 · 886 阅读 · 0 评论 -
Curling 2.0 - POJ 3009
参考的这个思路:枚举冰球下一个可能所在的所有位置然后DFS。改了一天的BUG,结果发现这个的长宽是反过来输入的,裂开。#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 50;int g[N][N];int n, m;int ex, ey;int xx[4] = {1,原创 2021-12-13 19:57:28 · 304 阅读 · 0 评论 -
D - Neighbors(并查集)
题意:n个人排队,m个意愿,每个意愿给两个数a,b,意思是a和b想站一起,问最后能否完全符合他们的意愿排成一队。思路:当一个人想站一起的人数超过两人那么肯定是no如果关系构成了一个环,那么肯定也是no,当一个人想和两个人站一起但那两个人也想站一起的情况。之前自己也想到了,用了建图+拓扑排序+并查集,想复杂了。正确代码#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int d[N];int原创 2021-12-13 19:54:21 · 144 阅读 · 0 评论 -
Network Saboteur - POJ 2531
原题链接题意:有n台电脑,每台电脑之间与一个数据传输量,问你能否把这些电脑分成两部分A、 B,使A部分里所有的电脑连接到B里面所有的电脑后的传输量最大,给的是一个n * n 的二维数组,C[i][j] 表示电脑i和电脑j之间的数据传输量。若连接自己本身则数据传输量为0. 问最大传输量是多少?思路:用dfs把集合A所有可能的情况找出来,对于每种情况,不在集合A里的电脑肯定就在集合B里,看一下当前集合A和B之间的传输量是多少,然后比较最大值。最后输出即可。暴力做法,比较极限。代码#include&原创 2021-12-13 11:06:58 · 215 阅读 · 0 评论 -
Pots - POJ 3414
题意:给出两个桶,体积分别是A,B升。可以进行以下操作:1.FILL(i)FILL(i)FILL(i) 填满桶i(1≤i≤2)i (1 ≤ i ≤ 2)i(1≤i≤2)2.DROP(i)DROP(i)DROP(i) 清空桶i3.POUR(i,j)POUR(i,j)POUR(i,j) 将桶i内液体倒入桶j;在这个操作之后,要么桶j满(可能桶i中会有液体剩余),要么桶i空的(桶内所有液体都被倒入桶j)编写一个程序找出可能的最短的操作步骤,能够让其中一个桶内的液体达到c升。输入:A B原创 2021-12-12 20:12:21 · 92 阅读 · 0 评论 -
Prime Path - POJ 3126
题意:给你二个素数n和m,每次可以变换一位数字,变换完还是素数,问最少要几次才可以把n变成m。记一个学到的判断素数的新方法:费马小定理: 如果p是一个质数,而整数a不是p的倍数,则有a(p−1)≡1 (mod p)a^{(p-1)}≡1\,(mod\,p)a(p−1)≡1(modp),但是代码上还不太会用,有空去找找模板学一下。思路:广搜, 每个数都把个十百千位能变换的所有情况都放进队列,同时开一个mapmapmap来记录得到每个数变换的次数,初始化为-1,那么这个mapmapmap也可以实现记录原创 2021-12-12 20:09:52 · 79 阅读 · 0 评论 -
Find The Multiple - POJ 1426
Find The Multiple - POJ 1426 - Virtual Judge (vjudge.net)题意:给一个n,求一个能被它整除的数只由01组成思路:宽搜,先放进去一个1,然后每次把所有的添进去,在后面加一个1或者0,然后有符合要求的就输出并退出。#include <iostream>#include <queue>#define int long longusing namespace std;const int N = 1e3 + 10;in原创 2021-12-12 20:08:23 · 82 阅读 · 0 评论 -
D - Neighbors(并查集
题意:n个人排队,m个意愿,每个意愿给两个数a,b,意思是a和b想站一起,问最后能否完全符合他们的意愿排成一队。思路:当一个人想站一起的人数超过两人那么肯定是no如果关系构成了一个环,那么肯定也是no,当一个人想和两个人站一起但那两个人也想站一起的情况。之前自己也想到了,用了建图+拓扑排序+并查集,想复杂了。错误代码#include<bits/stdc++.h> #define int long longusing namespace std;const int N =原创 2021-12-12 20:06:21 · 225 阅读 · 0 评论 -
Catch That Cow
原题链接题意农夫在n, 奶牛在k,农夫可以去x + 1, x - 1, x * 2,代价为1,请问如何花费最小找到奶牛。思路用宽搜,把可以走的每种走法加入队列;注意判断简直 0<=&&<=N,剪枝,否则会超时,还要注意找到了就退出。代码#include <iostream>#include <queue>#include <algorithm>#include <cstdio>#include <cstr原创 2021-12-07 09:03:05 · 69 阅读 · 0 评论 -
abc229_e Graph Destruction 并查集
原题链接题意给一个n个点,m条边的图,问依次删去点1 - n,剩余的部分可以组成几个连通块。思路自己的思路一开始不会写,大概看了一眼题解后自己想的是存一个无向图,然后从后往前恢复点,用并查集,然后把比当前点大的且与当前点相连的点合并,合并完以后从最后一个点到当前这个点遍历一遍找有几个不同的部分,然后加入答案数组,可惜这种做法虽然能过大半的样例但是却超时了。正解思路也是用并查集,从后往前恢复点,每恢复一个点答案都+1(假设都不连通),然后去枚举所有和它相连的点,只要有一个点相连但它们并不在同一原创 2021-12-02 10:11:51 · 1266 阅读 · 0 评论 -
CF1611E1 Escape The Maze (easy version)+ CF1611E2 Escape The Maze (hard version)
原题链接学习的这个思路总之就是,每次先更新点的深度,然后判断该点是不是朋友点是的话更新一下最近的朋友点的距离,然后再判断是不是叶子节点是的话标记为安全,然后回溯,更新最近的朋友点的深度,然后如果是安全点更新状态标记,说明该点下面有安全点,在遍历完下面所有点之后,距离当前点最近的朋友点距离也更新好了,然后算出根节点到该点的距离是否小于最近的朋友点到该店的距离,是的话就说明该点也是安全点。最终判断第一个点是不是安全点即可。#include<bits/stdc++.h> using na原创 2021-12-01 14:10:25 · 891 阅读 · 1 评论 -
HDU1285 确定比赛名次
原题链接拓扑排序模板题,核心就是每次选入度为0的点中最小的,用一个for循环找第一个入度为0的点跳出即可,还要注意格式问题,md,wa了九次。。。。。。。。。。#include<bits/stdc++.h>using namespace std;const int N = 550;vector<int> g[N];vector<int> ans;int n, m, d[N];void topsort(){ queue<int> q;原创 2021-11-29 13:40:56 · 365 阅读 · 0 评论 -
CF1611D Weights Assignment For Tree Edges
题意T组测试用例n个节点第一行n个数表示b[i] 是 i 的父节点第二行n个数表示p[i] 到根节点的距离是 第 i 小的要求按给的排名给每条边赋值,根节点距离是 0 ,如果没有符合要求的 输出-1,如果有多种答案,输出任意其一。思路p[i] 到根节点的距离是 第 i 小的,那么就把它当成p[i] 到根节点的距离是i,再开一个d[i]数组,使d[p[i]] = i,意思是i 点到根节点的距离是d[i].要想符合要求,那么肯定一个子节点到根节点的距离大于它的父节点到根节点的距离,否则就是-1。原创 2021-11-26 09:37:18 · 398 阅读 · 0 评论 -
关于图的宽搜,图中点的层次
原题链接总之就是把能扩展的点取出来,然后弹出,然后把能扩展的点都放进去,然后更新距离,最后输出最小值即可!实际上我认为宽搜比深搜简单,如果会队列的话。STL版队列#include <iostream>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int N = 100005, M = N * 2;int n, m;int原创 2021-11-25 17:07:04 · 153 阅读 · 0 评论 -
关于我突然就大彻大悟了图的深搜和树的重心这件事的一些总结
原题链接关于图的存储:邻接表定义 int h[N * 2]; //当每个节点作为头节点时,指向的是当前点所连接的所有点的指针 int ne[N * 2];//当前下标的下一个下标 int e[N * 2]; //用来存储元素 int idx; //指针解释每个h对应的是当前点连接的所有和它距离为1的点,所以ne指向的是下一个点,-1就是没有点了加边void add(int a, int b){ e[idx] = b; //给b开一个指针 ne[idx] = h[a]; //将i原创 2021-11-25 16:42:52 · 346 阅读 · 0 评论 -
图论模板整理
Dijkstra(朴素版)模板题链接代码#include<bits/stdc++.h> using namespace std;const int N = 510;int n, m, g[N][N], dist[N];bool st[N];int dijkstra(){ memset(dist, 0x3f, sizeof dist); dist[1] = 0; for(int i = 0; i < n; i ++)//迭代n次 { int t = -原创 2021-07-10 14:26:00 · 164 阅读 · 0 评论