拓扑排序(topo sort)之 最大食物链计数( 洛谷P4017)
前言:
复习复习拓扑排序,自己把自己弄没了/kk
题目传送门
简化题意:
在一个DAG中,求从所有入度为0的点到所有出度为0的点路径的条数
md理解错题意把自己卡了半天,生物学的好的就可以直接理解为求食物链的数目就OK了
只要不和我一样以为是求最长链的个数就不会有大问题
不跟我一样傻乎乎的求最长路计数就没问题
看到DAG , 看到入度为0 ,出度为0,脑子就自然跳出一个东西 拓扑排序 这个东西单独考的还是蛮少的,就我目前知识点来看,这个和强联通分量联系是最多的,毕竟缩完点后的DAG你不会写了你可以用topo打暴力\(O(n+m)\) SPFA 玄学复杂度
拓扑排序其实没啥可以讲的,这个东西原理很简单
- 每次找到入度为0的点让它进队列
- 当队列不为空,取出队首,遍历它所能到达的所有点,然后把这两个点之间的边删去如果遍历到的点的入度变成 0 了,这个点入队
- 重复以上过程,完事(遍历过程中你想干啥干啥)
回归本题,这个题可以通过tupo来解决到每一个出度为 0 的点有几条路线
$dp[from] = dp[fomr] + dp[to] $ 每一个入度为0的点初始化\(dp[x] = 1\)
最后可以加每一个出度为0的点的dp值就可以得到答案
\(ans =\sum dp_i | i \in cd[i]=0\)
The Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int N = 5e5+100;
const int mod = 80112002;
int read(){
int s = 0 ,f = 1; char ch = getchar();
while(ch < '0'||ch > '9'){if(ch == '-') f = -1 ; ch = getchar();}
while(ch >= '0'&&ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
return s * f;
}
struct node{
int from, to, dis , next;
}e[N << 1];
struct Queue{
int a[N] , head = 1 ,tail = 0;
void Push(int x){ a[++tail] = x;return ; }
void Pop(){ head++; }
bool Empty(){ return head > tail;}
int Front(){ return a[head];}
}q;
int rd[N],cd[N],dp[N];
int head[N] , nume;
void add_edge(int from, int to){
e[++nume].to = to ,e[nume].next = head[from] , head[from] = nume;
}
void tupo(){
while(!q.Empty()){
int fr = q.Front();
//cout<<fr<<" ";
q.Pop();
for(int i = head[fr] ; i ; i = e[i].next){
int to = e[i].to;
rd[to]--;
dp[to] = (dp[fr] + dp[to]) % mod ;
if(rd[to] == 0) q.Push(to);
}
}
}
int main(){
int n = read() , m = read();
for(int i = 1 ,u ,v ; i <= m ;i++){
u = read() , v = read() ;
add_edge( u, v) ;
rd[v]++,cd[u]++;
}
for(int i = 1 ; i <= n ;i++){
if(rd[i] == 0) q.Push(i),dp[i] = 1;
}
tupo();
int ans = 0;
for(int i = 1 ; i <= n ;i++)
if(!cd[i])
ans =(ans+dp[i]) % mod;
printf("%d",ans);
return 0;
}
拓扑排序(topo sort)之 最大食物链计数( 洛谷P4017)的更多相关文章
- 洛谷 P4017 最大食物链计数
洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写 ...
- 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序
洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...
- 洛谷 P4017 最大食物链计数 (拓扑排序,思维)
题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: 1.首先,我们用\ ...
- 拓扑排序 Topological Sort
2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...
- LeetCode编程训练 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort
概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...
- 洛谷——P4017 最大食物链计数
P4017 最大食物链计数 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧 ...
- 洛谷P4017 最大食物链计数
拓扑排序板子题 #include <iostream> #include <cstdio> #include <cstring> #include <queu ...
随机推荐
- 如何优雅的将Object转换成List
Main主函数中的 Object obj模拟了List对象.后续的代码首先判断obj是否是List类型,然后使用Class.cast做类型转换. 如果你想使用更方便的方法,可以直接调用下面的函数. p ...
- Map集合,Map常用子类
Map 集合 1,Collection中的集合,元素是孤立的,向季和忠储存的元素采用一个元素方式储存 2,Map中的集合,元素是成对存在的,每个元素中的集合称为双列集合 3,Collection中的集 ...
- C#扫盲篇(三):Action和Func委托--实话实说
一.基础定义 老王想找老张的老婆出去耍,但是一看,老张还在厨房煮饭.于是老王就对老张隔壁的淑芬说:"等下老张吃完饭出去喝茶,你就把前门晒的苞谷收了,老张从左门出,你就收右边的苞谷,我就知道从 ...
- 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..
1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...
- JAVA原生mvc实现用户信息的增删查改
笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...
- 简单TCP服务器和TCP客户端源码(Golang)
以下代码为服务端,非最终版代码,服务端可以接受多个客户端的请求,且所有消息会显示在服务端上,服务端无法发送消息: package main import ( "fmt" " ...
- 常用 .gitignore 模板
前言 每次建项目的时候可以直接复制了,也算是方便自己,以后发现少的会更新 正文 作用 git提交时忽略文件 文件名 .gitignore Python # Byte-compiled / optimi ...
- LeetCode235 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖 ...
- SpringBoot嵌入式Servlet容器
SpringBoot默认是将Tomcat作为嵌入式的servlet容器. 问题: 如何修改嵌入式的servlet容器? 1)在配置文件中设置对应的属性值 server.port=8081 # Tomc ...
- 当Django设置DEBUG为False时,发现admin和html的静态资源文件加载失败的解决办法
当Django设置DEBUG为False时,发现admin和html的静态资源文件加载失败,折腾一段时间终于找到解决办法: 1.先在setting文件增加BASE_DIR(项目的路径) BASE_DI ...