图论
破而后立呀
这个作者很懒,什么都没留下…
展开
-
EOJ Monthly 2021.10 Sponsored by TuSimple B. Secret(BFS)
菜鸡只会做水题// #pragma GCC optimize(2)#include <algorithm>#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <random>#include <cctype>#include <bitset>#include <s...原创 2022-03-09 11:41:09 · 168 阅读 · 0 评论 -
关押罪犯 (二分+二分图判定)
之前在洛谷上用并查集做过一次(但是显然我已经忘了怎么做了)。对当前怨气值w进行判定,判断只用大于当前怨气值w的边进行二分图染色能否将原图分成两部分,剩下怨气值小于w的不用考虑,因为不会对当前答案造成影响。不断二分找到最小的符合答案的w。#include <bits/stdc++.h>#define IO \ ios::sync_with_stdio(false); \ // cin.tie(0);原创 2021-03-31 13:54:03 · 78 阅读 · 0 评论 -
EOJ 2021 2月月赛 A. 昔我往矣(LCA+DFS序列)
树链刨分把DFS序搞出来,为之后求LCA做准备,对五个点根据DFS序排序,找到DFS序最小和DFS序最大的点的LCA(因为在一个颗子树中的DFS序是连续的,所以这样就可以包含住所有的点),之后把剩余三个点并到这条链上,并的过程中求当前要并的点u和已经处理过的点的最深的LCA(最深的保证答案最优,因为越往上花费越大),用这个LCA维护答案,然后将当前点u加入到已经处理过的点集。#include <bits/stdc++.h>#define IO原创 2021-03-30 12:10:24 · 79 阅读 · 0 评论 -
2021年度训练联盟热身训练赛第四场 E.How Many to Be Happy?(最小割)
如果想让一条边(端点分别为a和b,边权为w)在一个无向连通图的MST中,那么从a到b(不通过这条边)不能有比w更小的边,那么只需要求一个a到b最小割让a到b不连通即可,所以对边权排序,小于w的边建图跑dinic累计答案即可。#include <bits/stdc++.h>#define IO \ ios::sync_with_stdio(false); \ // cout.tie(0);#define lson(x) n.原创 2021-03-29 21:11:34 · 71 阅读 · 0 评论 -
ABC 192 E - Train(最短路)
BFS跑个最短路,不断更新到达各个点的最短时间。#include <iostream>#include <cmath>#include <map>#include <set>#include <algorithm>#include <cstring>#include <cctype>#include <queue>#include <vector>#define IO原创 2021-02-22 21:47:43 · 129 阅读 · 0 评论 -
atcoder 187 E - Through Path(树上差分)
题意:给定一颗树,每条边连接a和b,每一条边可能有两种操作:1.以a为起点并且不经过b的所有点权值+x2.以b为起点并且不经过a的所有点权值+x思路:从1号点开始BFS,dep【1】=1,给每个点标记好深度。假设起点为a,不能经过的点为b,如果dep【a】< dep【b】 ,那么val【1】+=x,val【b】-=x;如果dep【a】> dep[b],直接val【a】+=x。最后再跑一遍BFS,将val值依次传递就ok了。树上差分还是第一次见,牛啊#incl原创 2021-02-20 13:36:18 · 242 阅读 · 0 评论 -
atcoder 191E - Come Back Quickly(最小权值环)
对每一条边的两个邻接点a和b,从a->b的最小权值环为这条边的权值w+b到a的最小权值(通过Dijkstra求出),题目的点和边最多只有2000个,对每个边都跑一次dij也不会Tle。跑完之后如果存在环的话,那么顺着最短路更新答案。// #pragma GCC optimize(2)// #include <random>// #include <windows.h>// #include <ctime>#include <algorithm&g原创 2021-07-14 17:28:18 · 189 阅读 · 0 评论 -
C. Road Improvement
题目大意:给定一个联通的树,n个点,n-1条边,但是一开始所有的路都是坏掉的,需要把所有的路全部修好,修一条路的时候需要这条路的两个端点u,v同时开工,一个点一天只能修一条路,修一条路需要一天时间。问最少需要多少天才能把所有的路修好,同时输出每一个天修的路的编号(按照输入顺序)。容易得出最少需要的天数等于最大的点的度数(假设为k),因为一个点一天只能开工一条路。然后找一个点开始DFS,假设一条边被修好的那天为d,那么1<=d<=k,搜索的时候只要保证接下来的边的d不和之前的搜索.原创 2021-07-15 08:15:48 · 152 阅读 · 0 评论 -
F. Graph Without Long Directed Paths
// #pragma GCC optimize(2)// #include <random>#include <algorithm>#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <cctype>#include <bitset>#include <string>...原创 2021-07-15 08:15:54 · 92 阅读 · 0 评论 -
1454E.Number of Simple Paths
题目大意:给定一个n个点n条边的无向连通图,求图中简单路径的个数,1->2>3和3->2->1被看做同一个答案。概念引入:假如一个图就是一个首尾依次相连的环路,那么图上任意两点都有两条简单路径。一颗树上的点之间只有一条路径。这道题目可以看出是一棵树上加了一条边,那么这棵树上一定存在环。那么一部分点之间就可以通过在环上行走从而使互相之间有两条简单路径,但是一部分点没有,那就是挂在环上的树上的点,他们之间互相只有一条路径。这个图其实是一个基环树。// ...原创 2021-07-15 08:16:02 · 172 阅读 · 0 评论 -
P2756 飞行员配对方案问题(最大流)
容易看出题目是求一个最大匹配数目,可以建一个超级源点S和一个超级汇点T跑dinic,最后判一下边的剩余流量即可。我是跑的网络流,匈牙利算法求一个二分图最大匹配数目也是可以的。菜鸡只会做板子题。。。// #pragma GCC optimize(2)// #include <random>// #include <windows.h>// #include <ctime>#include <algorithm>#include <i原创 2021-07-15 08:16:09 · 229 阅读 · 0 评论 -
Codeforces - 741C.Arpa’s overnight party and Mehrdad’s silent entering(二分图构造)
如果能想到一定有解,并且构造出二分图就好做了,情侣之间连边,并且相邻两人连边(这样就满足了相邻三人之间至少两种食物),之后跑一下BFS染色把方案构造出来。#include <bits/stdc++.h>using namespace std;const int maxn = 2e5 + 10;int n;vector<int> g[maxn];int x[maxn], y[maxn];int col[maxn];void BFS(int s){ queu原创 2021-07-15 08:16:16 · 222 阅读 · 0 评论 -
小米热身赛D.Router Mesh(Tarjan求点双)
题目大意:给定一个无向图,有n个点,m条边,依次去掉每一个点(仅删掉这一个点)后,原图中的连通分量个数。原创 2020-11-07 17:20:32 · 167 阅读 · 0 评论 -
T103492 【模板】点双连通分量
// #pragma GCC optimize(2)#include <algorithm>#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <random>#include <cctype>#include <bitset>#include <string>#...原创 2021-07-16 12:16:35 · 274 阅读 · 0 评论 -
Hdu2647Reward(拓扑排序,输入反向建图)
n个人,m种关系,输入a,b,表示a比b的工资高,每个人的基本工资都为888,至少需要准备多少钱发工资。// #pragma GCC optimize(2)#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <string>#include <vector>#in原创 2021-07-19 16:34:02 · 124 阅读 · 0 评论 -
计蒜客2020.7.27 H.Knights Airways (优先队列+拓扑排序)
题意:有很多航班,为了让所有人都能赶上航班,所以如果存在航班 a -> b ,b -> c ,那么后一个航班必须等待第一个航班飞到目的地后一个航班才能起飞。容易发现这存在着前后关系,需要用拓扑排序,但是呢,题目给出了每一个航班的班号,对于没有前后这种等待关系的航班则先输出航班号小的,有这种前后关系则先输出需要先起飞的航班号。这就需要我们用一个优先队列来代替普通的队列来实现拓扑排序,对于每一个航班的出发地和目的地(我这里为了练手专门写了一下Trie树)都需要对应到数字,这样才能建图,在拓扑排.原创 2021-07-19 16:34:19 · 190 阅读 · 0 评论 -
计蒜客 7.22 K. Mario Kart(01背包+最短路)
题意:在一个一维的坐标轴上,给定n个点的位置,还给定m种硬币,每个硬币都有一个C和V,C代表这种硬币的花费,V代表这种硬币可以传送的距离。题目还给定一个L,如果两个点之间的最小花费超过L那么两个点之间不能达到。思路:先用01背包处理一下所有可能的距离,然后每两个点之间判断一下是否能到达。再根据是否能到达建图。最后跑一下Dijkstra或者BFS都行,当然对于这个题目BFS更好写。code:#include <iostream>#include <cstdio>原创 2021-07-21 12:47:25 · 220 阅读 · 0 评论 -
POJ 3321 Apple Tree(DFS序列+树状数组)
题目传送门之前做过一个类似的。https://blog.csdn.net/qq_44115065/article/details/105978281对于这个题目:只需要在树状数组上进行单点修改就可以。#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <string>原创 2021-07-21 12:47:58 · 134 阅读 · 0 评论 -
牛客 华华和月月逛公园(Tarjan找桥)
如题,在一个无向连通图中,只有桥是必须走的,其余的都可以不走,找出所有的桥,然后边的数量减掉桥的数量就可以。#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <string>#include <vector>#include <stack>#...原创 2021-07-21 12:48:51 · 135 阅读 · 0 评论 -
牛客小白月赛25 C.白魔法师
主要思路:BFS求一下每个白色连通快的大小,然后对每一个黑色点逐个判断,判断通过这个黑色点可以连通多少个白色连通块,把这些白色连通块大小相加再+1,最后答案维护一下最大值就行了。如果没有黑色点的话,直接输出最大的白色连通块就好。否则输出上述维护的ans。这个题真滴就差一点,一开始犯浑想成求树上最大直径了,想成只能连接两个连通块,fo自己了,也算是个有点小难度的图论题吧。看着题解很多都是并查集做的,本蒟蒻的比标程还稍微快那么一倍,O(∩_∩)O哈哈~#include <i...原创 2021-07-21 12:48:57 · 348 阅读 · 0 评论 -
POJ1679The Unique MST(次小生成树)
题目本题的思路就是判断一个图的最小生成树和次小生成树的权值是否一样,也就是最小生成树是否唯一。先跑一遍prim求出最小生成树后,再将每一条不在最小生成树里的边加入MST,然后删掉形成的环上权值最大的边,最后判断一下就可以。qq学长的博客:https://blog.csdn.net/qq_28954601/article/details/71102139别的大佬的:https://www.cnblogs.com/bianjunting/p/10829212.html我的code:#inc原创 2021-07-22 10:20:31 · 133 阅读 · 0 评论 -
Hdu 1269迷宫城堡(Tarjan 求强连通分量)
题目根据题意,需要满足在一个有向图中满足任意两点之间可以互相到达,也就是说这个图的最大连通子图就是它本身,Tarjan算法找一下强联通分量即可,且强连通分量个数为1。。#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <string>#include <vector&原创 2021-07-22 10:22:39 · 184 阅读 · 0 评论 -
Hdu3974 Assign the task(DFS序建立线段树)
题意:一个人只有一个boss,一开始呢所有人都没有任务,当给一个人安排任务时,他的所有下属也被安排了这个任务,包括他下属的下属,根据题意这是一颗有根树。那我们就可以找到根结点,从根结点开始DFS,从而得到每个结点的dfs序列(dfn)和以这个结点为根的子树的大小(size),然后我们就可以借助这两个数组建立线段树,进行区间修改和单点查询。区间修改的时候修改结点x那就是将任务分配给结...原创 2021-07-22 10:22:53 · 188 阅读 · 0 评论 -
Hdu 2603过山车 二分图最大匹配匈牙利算法模板题
匈牙利算法模板题,稍微注意一下先输入m,再输入n,而且是单向边。code:#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cmath>#include <string>#include...原创 2021-07-22 10:23:08 · 191 阅读 · 0 评论 -
牛客小白月赛23 G.树上求和
还是这样的图论题做的太少了,其实不难想。1、DFS跑一遍求出每一个点的子树大小2、贪心排序按每条边出现在树链中的次数分配权值,出现的次数多的权值小。仔细说一下稍微有点难想的每条边出现的次数。代码:#include <iostream>#include <malloc.h>#include <cstdio>#includ...原创 2021-07-23 20:12:47 · 355 阅读 · 1 评论 -
K. Problem K. Road Network
传送门:https://nanti.jisuanke.com/t/44347这个题目 是说添加一条边让形成的环最大,那么就可以求一条树上的最长链,也就是树的直径。1 DFS+DP2 两次DFS#include <iostream>#include <malloc.h>#include <cstdio>#include <algori...原创 2021-07-23 20:13:01 · 194 阅读 · 0 评论 -
牛客 第6场 B 图 (这题名字真短)
简单路径 就是这条路径上没有环。这个题目原创 2021-07-24 12:16:51 · 370 阅读 · 0 评论 -
牛客小白月赛21 D 菜逼wxy
多做题呀,不能光看书!学车好浪费时间~~~下午的也不能参加了。。#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <queue>#include <iostream>using nam...原创 2021-07-26 09:53:14 · 240 阅读 · 0 评论 -
大臣的旅费(树的直径)
windows+shift+s不能截图了,百度了也没解决,起床再说吧,留着以后做板子#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>using n...原创 2021-07-26 09:53:30 · 181 阅读 · 0 评论 -
RMQ 与 LCA
RMQ (range maximum/ minimumquery)首先介绍一下 ST表也就是(sparse Table算法),该算法基于倍增思想(倍增好像跟dp有点关系),该算法需要用O(nlogn)的时间来预处理,然后每次查询的时候就可以达到O(1)的时间复杂度,也就是说它不支持在线修改。初始化 最小值for(int j=1;(1<<j)<=n;j++) {...原创 2021-07-26 09:53:55 · 538 阅读 · 2 评论 -
Dining (网络流拆点+Dinic)
给出N头奶牛和F种食物,D种饮料,每一头牛都有自己喜欢的饮料和食物,每一头牛获得自己喜欢的饮料和食物各一份,这头牛就会高兴,一种饮料或一种食物只能被一头牛获得,问最多能让多少头牛高兴。这个题拆点什么的就不说了,我也想不出,但是对Dinic 算法倒是比暑假的时候清晰多了。Dinic 先是对原网络从源点到汇点BFS分层,只要能把汇点的层分出来,那么说明肯定有流量可以从源点流到汇点,然后就是从源...原创 2021-07-27 15:16:15 · 227 阅读 · 0 评论 -
落谷p3384 树链刨分 代码真长!
注释还算比较详细。。#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;const int maxn=100000+10;const int maxm=10000...原创 2021-07-27 15:17:16 · 207 阅读 · 2 评论 -
tarjan 算法总结
求割点 :注意在求割点的时候,假如u的邻接点v已经被访问过,那么low【u】=min(low【u】,num【v】)!!#include<bits/stdc++.h>using namespace std;const int maxn=20000+10;const int maxm=100000+10;struct Edge{ int before; int to...原创 2021-07-27 15:17:20 · 333 阅读 · 1 评论 -
Wormholes (spfa和bellman-ford板子题)
DescriptionWhile 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 ...原创 2021-07-27 15:17:24 · 175 阅读 · 0 评论 -
落谷p3387 (tarjan缩点+拓扑排序)
https://www.luogu.org/problem/P3387 时间一晃一晃就过去了一下午瞎捣鼓捣鼓又没了,总结一下这几个模板回宿舍。。。这个题主要就是用到了tarjan缩点,将一个强连通分量里所有点缩成一个点,其中很重要的一步就是low【u】=min(low【u】,low【v】),其中v是u->v这条边的终点。感性理解一下,...原创 2021-07-27 15:17:29 · 307 阅读 · 0 评论 -
P2860 [USACO06JAN]冗余路径Redundant Paths(边双连通分量问题,有重边)
题目描述In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten A...原创 2021-07-29 11:07:46 · 175 阅读 · 0 评论 -
单源最短路径(堆优化)dijstra
倦了#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int maxn=1e4+10;const int maxm=5e5+10;const int inf=0x3f3f3f3f;int...原创 2021-07-29 11:07:41 · 421 阅读 · 0 评论 -
upc 可达性统计 (拓扑排序+bitset)
题目描述给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。N,M≤30000。输入第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边。输出共N行,表示每个点能够到达的点的数量。样例输入10 103 82 32 55 95 92 33 94 82 104 9样例输出163...原创 2021-07-29 11:07:23 · 204 阅读 · 0 评论 -
P1341 无序字母对 (欧拉回路,dfs)
https://www.luogu.org/problem/P1341如何判断一个无向图是不是欧拉图充要条件:图为连通图,若存在奇度顶点,则奇度顶点的个数为2#include<cstdio>#include<iostream>#include<cstring> #include<algorithm>#include<c...原创 2021-07-28 10:46:33 · 128 阅读 · 0 评论 -
问题 G: Cycles
题目描述The ACM kingdom has n ≥ 2 cities, numbered from 1 to n , and m (bidirectional) roads.Each road connects two distinct cities. For all i,j ∈ {1,2, … , n}, there is at most one road connecting cit...原创 2021-07-28 10:46:29 · 404 阅读 · 0 评论