图论
ModestCoder_
一个modest的coder
展开
-
【题解】LuoGu4645:[COCI2006-2007 Contest#3] BICIKLI
原题传送门如果是求一个点到另一个点的路径条数,那么直接用拓扑就好了但是这道题目里面不一定是DAGDAGDAG所以要判环,问题是有些环跟自己没关系,存在着并不影响答案,但是如果我能经过一个环到达终点,那么我就有无数条路径,所以是inf就是如何判断会不会走过环从起点跑一遍dfsdfsdfs,vis1vis1vis1表示哪些点被经过建反图,从终点跑一遍dfsdfsdfs,vis2vis2vis2表示哪些点被经过对于一个点uuu,有一条合法路径经过uuu的充要条件是vis1u=1且vis2u=1vis原创 2020-11-01 10:41:32 · 170 阅读 · 0 评论 -
【题解】LuoGu6286:Cezar
原题传送门一开始看错了题意,错以为是每个字符串里面加密后排序后来才发现是字符串之间排序那么对于两个字符串sai,sai+1s_{a_i},s_{a_{i+1}}sai,sai+1,加密后的sais_{a_i}sai的字典序要小于sai+1s_{a_{i+1}}sai+1可以从最高位开始比较,第一位不同的字符,比如是c1,c2c1,c2c1,c2,说明加密后的c1<c2c1<c2c1<c2,就从c1c1c1往c2c2c2连一条有向边最终做一遍拓扑构造答案如果有点的原创 2020-10-22 16:43:01 · 144 阅读 · 0 评论 -
【题解】LuoGu6145:[USACO20FEB]Timeline G
原题传送门因为原图是一个DAG,所以直接跑一个拓扑但是我一开始是用跑最长路的方法做的,虽然用spfaspfaspfa也可以但是我用了堆优dijkdijkdijk,就错掉了,所以这里抛出一个问题,为什么堆优不行?Code:#include <bits/stdc++.h>#define maxn 100010using namespace std;struct Edge{ int to, next, len;}edge[maxn << 1];queue <in原创 2020-09-27 19:24:46 · 232 阅读 · 0 评论 -
【题解】CF915D:Almost Acyclic Graph
原题传送门如果枚举删边,然后拓扑判环,会小T一点然后发现其实可以枚举哪个点入度-1,在判环,等价于删边优化到了O(n2)O(n^2)O(n2)Code:#include <bits/stdc++.h>#define maxn 500010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];int num, head[maxn], d[maxn], deg[maxn], n, m, flag原创 2020-09-17 21:32:36 · 136 阅读 · 0 评论 -
【题解】LuoGu1265:公路修建
原题传送门这题题面看起来就是在讲一个算法的流程,然后是求最小生成树,用kruskalkruskalkruskal罕见的会爆内存,然而这题允许O(n2)O(n^2)O(n2)的复杂度,就用传说中的primprimprim解决Code:#include <bits/stdc++.h>#define maxn 5010#define LL long longusing namespace std;double x[maxn], y[maxn], dis[maxn], ans;int n原创 2020-08-30 17:56:29 · 200 阅读 · 0 评论 -
【题解】LuoGu1991:无线通讯网
原题传送门最小生成树,若有kkk个手机,那么可以让kkk个连通块连起来所以从小建边,只剩kkk个连通块时就输出Code:#include <bits/stdc++.h>#define maxn 1010#define maxm 1000010using namespace std;const double eps = 1e-5;struct Line{ int x, y; double len;}line[maxm], len[maxm];int x[maxn], y[原创 2020-08-28 13:58:55 · 336 阅读 · 1 评论 -
【题解】NOIp模拟:混合图
【题目描述】Hzwer神犇最近又征服了一个国家,然后接下来却也遇见了一个难题。Hzwer的国家有n个点,m条边,而作为国王,他十分喜欢游览自己的国家。他一般会从任意一个点出发,随便找边走,沿途欣赏路上的美景。但是我们的Hzwer是一个奇怪的人,他不喜欢走到自己以前走过的地方,他的国家本来有p1条有向边,p2条无向边,由于国王奇怪的爱好,他觉得整改所有无向边,使得他们变成有向边,要求整改完以后保证他的国家不可能出现从某个地点出发顺着路走一圈又回来的情况。(注:m=p1+p2.)概述:给你一张混合图,要求原创 2020-08-28 13:47:09 · 282 阅读 · 0 评论 -
【题解】LuoGu5687:[CSP-SJX2019]网格图
原题传送门肯定是让你一排一排的考虑那就一排一排的考虑暴力做法就是暴力kruskalkruskalkruskal,那么怎么把一整排看成一条边?这样就可以满分了根据kruskalkruskalkruskal我们可以知道,只要每次选取最小的边且还未联通就是最优的那么就直接一排一排的搞,每次加进来一排值最小的,但是要减去多余的部分(这部分若加入,那么会形成环)第一次出现横行或列行,全部加若不是第一次,则看与自己垂直的有几排,只有一排或没有,不会形成环,全加;否则有x(x>1)x(x>1)原创 2020-08-02 13:16:17 · 270 阅读 · 0 评论 -
【题解】LuoGu5683:[CSPJX2019]道路拆除
原题传送门一开始没什么头绪30pts:O(2m∗n)O(2^m*n)O(2m∗n)暴力20pts:一棵树,路径是唯一的,直接把根节点到s1,s2s1,s2s1,s2的链节选出来,顺便判断一下是不是<=t1/2<=t1/2<=t1/2就好了30pts:这时候他让你思考根节点到一个点怎么办,直接选取最短路就好了100pts:前面的其实告诉了我们两个信息:链,最短路想一想最终态是怎么样的既然如此,其实可以直接枚举图中的这个iii,求最小值就好了先预处理出1,s1,s21,s1原创 2020-08-01 18:28:10 · 390 阅读 · 0 评论 -
【题解】LuoGu5021:赛道修建
原题传送门二分答案树形dp验证对于每个点的儿子中尽可能两两组合(贪心)达到最大值,最好在这个基础之下还能选择一个尽可能长度大的路径和自己组合起来上传到父亲上去把儿子的值存下来,排序,首先用贪心(头尾指针扫描)求出最大赛道值,接着发现上传的值的大小满足可二分性,就二分,看看去掉二分的mid剩下的还能不能两两组合达到之前的答案Code:#include <bits/stdc++.h&...原创 2019-11-14 15:37:28 · 190 阅读 · 2 评论 -
【题解】LuoGu2661:信息传递
原题传送门直接遍历整张图,若是走到已经走过的点,两种情况这个点是刚刚走过的,绕回来了,说明是个环,更新答案这个点是以前走过的,那我就不用继续走下去了,不然只是把前人的路途重新走了一遍无用功Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;int n, nxt[maxn], vis[...原创 2019-11-14 08:43:33 · 205 阅读 · 0 评论 -
【题解】LuoGu2296:寻找道路
原题传送门细节挺多的,如果心情浮躁的话就很难调出来从终点跑反向边跑出能达到的点,这样就知道了哪些点无法到达终点用这些点跑反向边跑出出点无法和终点联通的点,这些点也是不能到达的剩下的点就是可以走的点,用bfsbfsbfs就可以了Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;stru...原创 2019-11-10 21:20:09 · 166 阅读 · 0 评论 -
【题解】LuoGu4822:[BJWC2012]冻结
原题传送门分层图最短路套路可以去看这道题目Code:#include <bits/stdc++.h>#define maxn 100010using namespace std;struct node{ int val, dis; bool operator < (const node &x) const{ return x.dis < dis; ...原创 2019-11-10 11:06:24 · 159 阅读 · 0 评论 -
【题解】LuoGu2245:星际导航
原题传送门最小瓶颈路与NOIp题货车运输类似kruskalkruskalkruskal建最小生成树,ststst表维护最大值Code:#include <bits/stdc++.h>#define maxn 300010using namespace std;struct Edge{ int to, next, len;}edge[maxn << 1];...原创 2019-11-09 18:42:55 · 222 阅读 · 0 评论 -
【题解】LuoGu2597:[ZJOI2012]灾难
原题传送门如果以生产者开始为根建树的话一个点可以向该点所有食物的lcalcalca以及这个lcalcalca的所有祖先贡献1灾难值根据上面两句话,就可以把这道题给做掉了不过还是讲一讲具体写法先拓扑排序调整顺序(从高级消费者到低级生产者),然后从生产者开始建树,一边建一边初始化倍增数组最终从最高级的消费者开始向下面的东西贡献灾难值Code:#include <bits/stdc...原创 2019-10-02 18:41:37 · 147 阅读 · 0 评论 -
【题解】LuoGu5361:[SDOI2019]热闹又尴尬的聚会
原题传送门构造题首先对于条件进行转化–>(p+1)(q+1)>n(p+1)(q+1)>n(p+1)(q+1)>n然后就是构造一个p,qp,qp,q出来考虑一种做法:在图中选出度数最小的点,这个度数记为did_idi将该点以及与该点直接相连的点删去重复上述过程直到无点为止取出did_idi最大的时刻的图作为第一个点集,此时热闹度p=dip=d_ip=di...原创 2019-09-22 12:47:40 · 174 阅读 · 0 评论 -
【题解】CF463D:Gargari and Permutations
原题传送门确实是一道不错的题目发现k特别小可以先O(n2)O(n^2)O(n2)枚举x,yx,yx,y,若xxx在每个数列中都在yyy前面,那么xxx就可以向yyy连一条边,这样建图建好以后整个图是一个DAGDAGDAG,跑一个拓扑DP就好了Code:#include <bits/stdc++.h>#define maxn 1000010#define _ 0using...原创 2019-09-10 20:17:53 · 210 阅读 · 0 评论 -
【题解】CF977E:Cyclic Components
原题传送门求环的个数直接dfs处理出每个连通块然后如果一个连通块的所有点的度数都为2,那么是一个环Code:#include <bits/stdc++.h>#define maxn 200010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];int num, head[max...原创 2019-08-28 18:14:32 · 216 阅读 · 0 评论 -
【题解】慈溪中学-8.14-T2
传送门貌似是一种叫2−SAT2-SAT2−SAT的东西我理解是一种建图思想分两层考虑选一个对的就要选两个错的,这样来建图然后缩点若一个点对应在两层的被缩在同一点,矛盾,输出-1否则正常输出Code:#include <bits/stdc++.h>#define maxn 100010using namespace std;struct Edge{ int to...原创 2019-08-15 08:07:07 · 172 阅读 · 0 评论 -
【题解】LuoGu2783:有机化学之神偶尔会做作弊
原题传送门没有思维难度的题目先把环缩成一个点然后重建图新图中求两点间距离当然是d[u]+d[v]−2d[lca]d[u]+d[v]-2d[lca]d[u]+d[v]−2d[lca]本题求的是点个数所以还要加一最后把答案用二进制输出Code:#include <bits/stdc++.h>#define maxn 50010using namespace std;s...原创 2019-08-14 12:35:21 · 184 阅读 · 0 评论 -
【题解】LuoGu1726:上白泽慧音
原题传送门就是求强连通分量的最大值,并且里面的点字典序最小那先跑一遍tarjan,然后按编号从小到大找到第一个所属强连通分量满足点数最大那么这个编号所属的强连通分量就是我们要输出的强连通分量Code:#include <bits/stdc++.h>#define maxn 50010using namespace std;struct Edge{ int to, ne...原创 2019-08-06 19:10:16 · 175 阅读 · 0 评论 -
【学习笔记】Tarjan之缩点
一、有向图强联通分量在有向图中,如果同时存在从x到y和从y到x的有向路径,则称x和y强连通。如果一张有向图中任意点对都强连通,那么称这张图是一个强连通图。有向图的极大强连通子图为强连通分量。图中的每个点只会属于一个强联通分量二、Tarjan算法求强联通分量原理是求出图的任意生成树,利用返祖边找环。对一个点维护dfn[x]表示该点的dfs序,low[x]表示x不经过x的祖先...原创 2019-07-16 15:02:27 · 1274 阅读 · 0 评论 -
【题解】LuoGu3469:[POI2008]BLO-Blockade
原题传送门考虑到割点如果一个点不是割点,那么答案就是2(n−1)2(n-1)2(n−1)如果是割点,那么答案是2(n−1)+割掉后个联通块size之积2(n-1)+割掉后个联通块size之积2(n−1)+割掉后个联通块size之积问题是怎么求这个size之积考虑割点求法,与之类似tarjan割点同时求size也不需要知道每个点到底是不是割点如果一个儿子不能不通过自己到达比自己更浅的...原创 2019-07-18 15:21:27 · 157 阅读 · 0 评论 -
【题解】LuoGu2341:[HAOI2006]受欢迎的牛
原题传送门先用tarjan缩点形成一个DAG然后两种做法一种缩好点后统计每个点的入度,若入度为总数-1,就是受欢迎的牛,然后我就wa掉了,因为新边可能重复所以换个角度,如果某个新点出度为0,那么是受欢迎的牛,但是若出度为0的点有多个,答案就是0(yy一下)Code:#include <bits/stdc++.h>#define maxn 100010using name...原创 2019-07-18 14:04:05 · 170 阅读 · 0 评论 -
【题解】LuoGu2573: [SCOI2012]滑雪
原题传送门时间胶囊是个好东西,这有一些奇怪的性质首先考虑建图,在输入的边的基础上,如果高度不同,高的往低的连一条单向边;如果高度相同,连一条双向边然后考虑求最多到达的点个数,由于我们拥有时间胶囊,所以直接从1开始bfs,遍历到的点都是可以走到的,感性理解一下最后考虑求最短距离,用kruskal即可,用到的边在bfs时加进去,排序有技巧,需要以一条边终点高度为第一关键字,边长为第二关键字排序...原创 2019-07-15 14:26:01 · 235 阅读 · 0 评论 -
CF723E:One-Way Reform
传送门答案上界为该无向图中的偶点数量,可以通过构造使得答案达到上界所以答案就是偶点数量可是还要输出方案,可以创造一个虚点与所有奇点连边,这样一来就可以跑欧拉路顺便答案是n-奇点个数Code:#include <bits/stdc++.h>#define maxn 210using namespace std;set <int> edge[maxn];in...原创 2019-07-15 13:41:04 · 256 阅读 · 0 评论 -
【题解】LuoGu3116:[USACO15JAN]约会时间Meeting Time
原题传送门拓扑上跑dpf[u][i]表示贝茜是否能跑到点u,距离为if[u][i]表示贝茜是否能跑到点u,距离为if[u][i]表示贝茜是否能跑到点u,距离为ig[u][i]同理,表示爱丽丝g[u][i]同理,表示爱丽丝g[u][i]同理,表示爱丽丝一边拓扑,一边做dp转移方程见代码最终从小到大枚举答案是否符合都不符合impossibleCode :#include <bi...原创 2019-07-15 11:06:07 · 223 阅读 · 0 评论 -
【题解】LuoGu3243:[HNOI2015]菜肴制作
原题传送门题意:给出一张有向无环图,求一个遍历序,要求其每个点在 被遍历之前要保证它的入度点已经全部被遍历,在此基础上 满足编号最小的尽量靠前,在此基础上编号次小的尽量靠 前……编号最大的尽量靠后。求一个方案。图的点数、边数 均不超过10^5。solution:拓扑+堆但是不能顺着做,发现题意的要求并不是裸的字典序最小但是如果反向建边,求字典序最大,最后反向输出可以达到最优并且满足...原创 2019-07-15 10:44:38 · 220 阅读 · 0 评论 -
【题解】LuoGu5022/NOIp2018:旅行
原题传送门考场里被自己实实在在的坑了一发,竟然没发现n、m小于5000!结果我一直在那想O(nlogn)的做法,今天尝试O(n^2)暴力考场里打了m=n−1m=n-1m=n−1 60分的部分,还是O(nlogn)的,代码就不放了,不好意思首先还是想m=n−1m=n-1m=n−1的情况,不用去想倒退这个动作,其实整个过程就是遍历一棵树,字典序最小当然就以1为根,在自己的儿子中从小到大依次遍历...原创 2019-04-07 21:32:06 · 290 阅读 · 1 评论 -
【学习笔记】Tarjan之割点
一、割点在无向图中,如果删去一个点后整张图不连通,那么这个点就是割点(割顶)。二、Tarjan求割点模板与求强连通分量类似对于一个点uuu是割点,满足下两个条件之一存在uuu的儿子sonusonusonu,使得low[sonu]>=dfn[u]low[sonu]>=dfn[u]low[sonu]>=dfn[u],即有儿子不通过自己走不到自己的祖先,那...原创 2019-07-16 16:05:00 · 300 阅读 · 0 评论 -
【题解】LuoGu2515:[HAOI2010]软件安装
原题传送门这题挺简单首先可以知道一个强连通分量要么全部选,要么全不选所以缩点缩好以后建新图,注意连边方向,从d[i]d[i]d[i]连到iii满足拓扑在DAG上跑DPdp[u][m]表示点u时,重量最多为m的最大价值dp[u][m]表示点u时,重量最多为m的最大价值dp[u][m]表示点u时,重量最多为m的最大价值转移显然Code:#include <bits/stdc+...原创 2019-07-19 07:50:57 · 185 阅读 · 0 评论 -
【题解】LuoGu4281:[AHOI2008]紧急集合 / 聚会
原题传送门这题挺简单首先,任意三个点可以有一个通式,看下图假设我们现在询问1 2 3三点发现它们走到4这个点是最优的,而4又是1与2的lca找找4这个点有什么性质lca(1,2)=4,lca(1,3)=5,lca(2,3)=5lca(1,2)=4,lca(1,3)=5,lca(2,3)=5lca(1,2)=4,lca(1,3)=5,lca(2,3)=5发现三点任意两点的lca有两个...原创 2019-07-23 15:00:52 · 172 阅读 · 0 评论 -
【题解】CF999E:Reachability from the Capital
原题传送门这是道水题先缩点,然后把新图中入度为0的点个数统计出来,就是答案注意的是如果起点sss所在的强连通分量入度为0,不能统计入答案Code:#include <bits/stdc++.h>#define maxn 5010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];...原创 2019-07-31 11:44:41 · 218 阅读 · 0 评论 -
CF453C:Little Pony and Summer Sun Celebration
原题传送门题意: 给出一张N个点M条边的无向图,有些点要求经过奇数次,有点要求经过偶数次,要求寻找一条满足要求的路径,且该路径长度不超过点数的四倍。N,M≤100000N, M≤100000N,M≤100000首先特判,若所有点都需经过偶数次,则答案为0否则任选一个需经过奇数次的点为根建树。很明显,叶子结点只访问一次,非叶节点只访问两次但是,如果非叶结点要求访问奇数次,上面的做法就会出现...原创 2019-07-22 14:28:39 · 168 阅读 · 0 评论 -
【题解】CF545E:Paths and Trees
原题传送门题意神奇,反正我是理解了好长的时间差不多就是求一个生成树,使得任意点到源点的最短路等于原图中的最短路再让这个生成树边权和最小很显然得先dij一下考虑dij过程中松弛的条件,跟一般的dij不一样,为了满足本题的要求,还要生成树边权最小自然是两点间路程相等情况下,经过的边数越多越好(感性理解一下)最短路跑出之后如何得知建出来的生成树?简单,对于每个点开一个preprepre数...原创 2019-07-30 17:29:53 · 264 阅读 · 0 评论 -
【题解】LuoGu5058:[ZJOI2004]嗅探器
原题传送门这道题数据范围太水了暴力:枚举答案,删掉点,看看两个中心是否联通如何判断连通性:BfsBfsBfs,复杂度O(n)O(n)O(n)并查集,复杂度O(m)O(m)O(m)反正数据水,我直接上并查集顺手连了个tarjan求割点因为答案只可能出现在割点中,稍稍小优化一下Code:#include <bits/stdc++.h>#define maxn 10...原创 2019-07-21 15:46:09 · 186 阅读 · 0 评论 -
【题解】LuoGu3225:[HNOI2012]矿场搭建
原题传送门读题花了我好一会时间,看来我的语文阅读能力不够这道题对于我这种小菜鸡还是有一点思维难度的因为有些点会坍塌,不妨理解为把某个点删掉,那么是不是就想到了一个图论里的玩意——割点先把割点求出,然后割掉,图变成了一堆联通块的集合对于每个联通块,因为块的内部并没有割点,对于块直接相连的其他割点个数分类讨论没有割点与块相连,必须随意选择两个点建立出口,块内部互相联通,如果只建一个出口,...原创 2019-07-21 14:36:37 · 159 阅读 · 0 评论 -
【题解】LuoGu2746:校园网Network of Schools
原题传送门又是可以用上强连通分量使用tarjan缩点,缩好的点建新图问1:就是求新图入度为0的点个数,没毛病吧问2:任一点都能到达其他点,说明是形成了一个环。环中任意一点入度出度不为0,那么我们只要求出入度为0的点个数与出度为0的点个数的更大的那个就行了(yy一下)有一个注意点就是,新图中只有一个点的情况要特判,答案是111 000Code:#include <bits/std...原创 2019-07-18 07:57:27 · 160 阅读 · 0 评论 -
【题解】LuoGu2941:[USACO09FEB]环绕岛屿Surround the Islands
原题传送门直接缩点,缩好后也不用建新图了,数据小边权取最小值对于每个新点,往外做一次,综合ans最后ans*2,因为往返Code:#include <bits/stdc++.h>#define maxn 1010#define LL long longusing namespace std;struct Edge{ int to, next;}edge[maxn...原创 2019-07-16 22:29:26 · 236 阅读 · 0 评论 -
【题解】LuoGu5151:HKE与他的小朋友
原题传送门题目描述现在有n个座位编号为11至nn,这些小朋友也编号11至nn。一开始所有小朋友都坐在相应的座位上。HKE的游戏可用一个n的排列A(A_1,A_2\cdots A_nA(A1 ,A2 ⋯An )表示。一轮游戏时,对于所有的1\leq i\leq n1≤i≤n,坐在位置ii上的小朋友坐到位置A_iAi 上。现在游戏进行了kk轮,HKE想知道游戏结束...原创 2019-02-08 11:54:44 · 385 阅读 · 0 评论