题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: ​ 1.首先,我们用\(in\)记录某个点的入度,\(out\)表示这个点向外所连的点. ​ 2.遍历所有点,找到入度为\(0\)的点,将其入队. ​ 3.遍历队列(将队头元素记录并存入答案后弹出),将入度为\(0\)的点所连边一条一条的消去,即所有的\(out[x]=-1\),且该点所连的点的入度都需要\(-1\),如…
洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环的有向图必定有入度为0的点.通过与题干分析可知,入度为0就是最佳生产者,出度为0就是最佳消费者.题干的大意就是找出图中一共有几条食物链是从最佳生产者指向最佳消费者. 我在题解区学习了拓扑排序后的第一次题解,然而只过了一个测试点,一片WA声.. 1 //动态规划 洛谷P4017 最大食物链计数 2 #…
洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧. 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的"最大食物链",指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者.) Delia非常急,所以你只有1秒的时间. 由于这个结果可能过大,你只需要输…
P4017 最大食物链计数 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧. 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者.) Delia非常急,所以你只有1秒的时间. 由于这个结果可能过大,你只需要输出总数模上80112002的…
P4017 最大食物链计数 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧. 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的"最大食物链",指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者.) Delia非常急,所以你只有1秒的时间. 由于这个结果可能过大,你只需要输出总数模上8011…
拓扑排序板子题 #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; //Mystery_Sky // #define maxn 1000010 #define maxm 5000050 #define mod 80112002 struct Road{ int next; int to; }; Road road[maxn…
题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先把每个节点的最短路求出来 转移的时候按拓扑序(也就是按距离从小到大排序)转移一下 然而有\(0\)边的时候会挂掉,原因是会有dis相同的时候,这时候单按dis排序会无法判断转移方向 一种方案是直接把所有\(0\)边加入到新图中,拓扑排序一遍.得到第二关键字 同时判断一下\(0\)环 #include…
传送门 按照题意模拟就行了. 先拓扑排序去掉不在环上面的点. 剩下的都是简单环了. 于是都dfsdfsdfs一遍求出最短的环就行. 代码: #include<bits/stdc++.h> using namespace std; const int N=2e5+5; int n,du[N],nxt[N],ans=0x3f3f3f3f; bool vis[N]; inline int dfs(int p,int len){ if(vis[p])return len; vis[p]=1; retu…
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5,1,2,3,4 但是上面这个想法的结果是2,3,4,5,1 那就想要不优化一下趴,按照能到达的点为第一关键字,自己点的编号为第二关键字排序呢 还是布星,,,<5,2><5,4><2,1><4,3><3,1> 正解应为5,2,1,4,3,但是上面这个想…
题目大意:给你$n$个不重复的数,其值域为$[0,2^k)$,问你至少需要将这$n$个数拆成多少个集合,使得它们互相不是对方的子集,并输出方案. 数据范围:$n≤10^6$,$k≤20$. $MD$我场上都想了啥.... 我们显然有一种$O(3^k)$的做法,对于数字$x$,我们枚举其子集,设当前枚举到的子集为$u$,我们连一条$u->x$的边,然后跑一个拓扑排序,即可确定至少需要划分为多少个集合(我场上根本没在想拓扑排序....) 然后,这个显然会$TLE+MLE$. 然后我们发现,若存在$u…
题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会有什么问题,因为它不影响它前面的选择: 我们可以建反图,从后往前按序号从大到小排序,倒序输出答案,这样就把序号大的尽量放在后面了. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<…
在DAG中,拓扑排序可以确定dp的顺序 把图的信息转化到一个拓扑序上 注意转移的时候要用边转移 这道题的dp是用刷表法 #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = (a); i < (b); i++) #define _for(i, a, b) for(register int i = (a); i <= (b); i++) using namespace std; ; struct Edge{…
老规矩,传送门 做题从头到尾的思路: 1. 这个题明显就是dfs数数量了,简单,邻接矩阵干他! TLE警告,8个点 额... 2. 老师说这玩意不能邻接矩阵?没事,还有邻接表,再来! 再次TLE 8个点 3. 我打记忆化搜索! 没有TLE,WA 8个点 4. 不开long long见祖宗... WA 6个点 5. 得出结论,偷懒失败,打前向星吧.... "你通过了此题 恭喜!" ... 恭喜... 好了,正经一点,来说这个题. 这个题是我刚学图论,dfs的时候开始做的,中间还放了很久,…
题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains eit…
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输…
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛>.时间复杂度\(\mathcal O(n\log^2n)\). 源代码: #include<cstdio> #include<cstring> #include<algorithm> const int N=1e6+1; char s[N]; int n,k,sa[N…
洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. #include <cstdio> #include <cstring> #include <algorithm> + ; ; int que[maxn]; bool vis[maxn]; * ma…
前言: 复习复习拓扑排序,自己把自己弄没了/kk 题目传送门 简化题意: 在一个DAG中,求从所有入度为0的点到所有出度为0的点路径的条数 md理解错题意把自己卡了半天,生物学的好的就可以直接理解为求食物链的数目就OK了 只要不和我一样以为是求最长链的个数就不会有大问题 不跟我一样傻乎乎的求最长路计数就没问题 看到DAG , 看到入度为0 ,出度为0,脑子就自然跳出一个东西 拓扑排序 这个东西单独考的还是蛮少的,就我目前知识点来看,这个和强联通分量联系是最多的,毕竟缩完点后的DAG你不会写了你可…
老师开始帮我们查漏补缺啦!我们的老师这两天给了我们一些我们没怎么学的函数和算法,比如STL的函数和拓扑排序之类的,这个题就是讲拓扑排序的. 先看题板: 题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧. 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其…
看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2  入度为2…… for循环 找到秃头 5  入队列, 然后给跟他有联系的所有点一一剃头,看谁再秃,秃了入队列,再对继往开来的秃子进行操作. #include<cstdio> #include<iostream> #include<queue> using namespace std; int n,m,ru[],c…
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\),有\(P_i>P_{\lfloor i/2 \rfloor}\). 计算\(1,2,...N\)的排列中有多少是\(Magic\)的,答案可能很大,只能输出模\(P\)以后的值 输入输出格式 输入格式: 输入文件的第一行包含两个整数\(n\)和\(p\),含义如上所述. 输出格式: 输出文件中仅包含一…
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=4562 一句话题意:给一个DAG,求有多少条不完全相同的链,使链首入度为0,链尾出度为0. 题解: 将每个入度为零的点权值为一,然后在拓扑排序的过程中将自身的权值加到出边所连的点,然后清空自身. 代码: #include<bits/stdc++.h> using namespace std; ; int vis[maxn],dp[maxn],ans,n,m,ru[maxn],cnt,he…
BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之和为\(sum\). #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int N = 13; ll f[N][N]; int a[N], nw; inline ll…
洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于是我就发现了一些规律. 先献给大家一个打表程序吧- #include <bits/stdc++.h> using namespace std; int main() { long long l,r,cnt[10]={}; for (long long t=0;t<=999999;++t) {…
洛谷 这是一道组合数学题. 对于一个长为n的序列,首先我们要选m个使之稳定\(C^{m}_{n}\). 且要保证剩下的序列不稳定,即错排\(D_{n-m}\). 所以答案就是:\[ANS=C^{m}_{n}+D_{n-m}\] 再看看数据范围:n最大\(10^6\),错排好办,直接递推: \[D[i]=(i-1)*(D[i-1]+D[i-2])\] D[0]=1,D[1]=0. 而组合数部分有点麻烦.\[C[i][j]=C[i-1][j]+C[i-1][j-1]\] 用上面这个公式可以做1000…
http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它以为最佳完美匹配是边权的乘积了,现在要你计算所有这种最佳完美匹配的边权乘积和.保证至少存在一个完美匹配. 思路: 这道题目虽然打着二分图的幌子,但其实吧,根本就不是二分图,哎. 对于右边的点来说,如果它的度数为1,那么与它匹配的点肯定是确定的,所以我们先通过拓扑排序来计算出所有确定的匹配.去除这些点…
洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{X+1} +-+ A_Y<0,1<X<=Y<n,\)令\(S=A_X +A_{X+1} +-+ A_Y\),对于\(A_{X-1}\)和\(A_{Y+1}\)分别加上S,\(A_X\)和\(A_Y\)分别减去S(如果X=Y就减两次).问最少几次这样的操作使得最终数列是完美的. 输入输出…
ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感觉不难,可能那时脑子混了,题意也没理解清楚.根据题目很容易看出,这跟拓扑排序有关,不过拓扑排序的作用在于判断给出的关系是否矛盾,在找判断可能是第(n+1)/2个元素还主要是思维. 哪个元素可能是中间的(n+1)/2个元素呢,就是那些明确在它前面的元素(比它大的)的数目和在它后面的元素(比它小的)的数目都不…
Description 给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多. Input 第一行两个正整数N.L(2 <= N <= 1,000,000, 0 <= L <= N).下面有N-1行,每行两个正整数A和B(1 <= A, B <= N),表示一条边(A,B). 首先有一个贪心:每一次选择的路径的两个端点都是两个叶子节点. 证明也很简单:如果端点不是叶子,那就在向下延申一点也一定不会更差. 先将所有叶子都列出来,假设有 $x$…
ACM思维题训练集合 Furik and Rubik love playing computer games. Furik has recently found a new game that greatly interested Rubik. The game consists of n parts and to complete each part a player may probably need to complete some other ones. We know that the…