• 题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径).

  • 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序:

    ​ 1.首先,我们用\(in\)记录某个点的入度,\(out\)表示这个点向外所连的点.

    ​ 2.遍历所有点,找到入度为\(0\)的点,将其入队.

    ​ 3.遍历队列(将队头元素记录并存入答案后弹出),将入度为\(0\)的点所连边一条一条的消去,即所有的\(out[x]=-1\),且该点所连的点的入度都需要\(-1\),如果某点的入度为\(0\),将其入队.

    ​ 4.最后我们所得到的一定是某一种情况的拓扑序列.

    那么对于该题,我们在求拓扑序列的同时,还要记录一下路径数,我们先使所有入度为\(0\)的点的路径数为\(1\),然后每次向外求拓扑序列时,对所有出边的点记录一个前缀和,最后累加一下出度为\(0\)的点的前缀和即可.

  • 代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6 + 10;
    const int mod = 80112002 ;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL; int n,m;
    int u,v;
    int num[N];
    vector<int> out[N];
    vector<int> in(N,0);
    vector<int> res; int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;++i){
    cin>>u>>v;
    in[v]++;
    out[u].pb(v);
    }
    queue<int> q;
    for(int i=1;i<=n;++i){
    if(in[i]==0){
    num[i]=1;
    q.push(i);
    }
    }
    while(!q.empty()){
    int now=q.front();
    q.pop(); res.pb(now);
    for(auto w:out[now]){
    if(w!=-1){ //如果这条边存在
    in[w]--;
    num[w]=(num[w]+num[now])%mod;
    if(in[w]==0){
    q.push(w);
    }
    w=-1; //删去这条边,但好像没什么用?
    }
    }
    }
    int ans=0;
    for(int i=1;i<=n;++i){
    if(out[i].empty()){
    ans=(ans+num[i])%mod;
    }
    }
    printf("%d\n",ans); return 0;
    }

最新文章

  1. mysql 存储过程 游标 判断游标是否为空
  2. swift 定时器的使用
  3. C++模板实例掌握
  4. html5的自定义data-*属性和jquery的data()方法的使用示例
  5. 移动前端开发之viewport的深入理解(转载)
  6. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
  7. Socket方法LAN多线程文件传输
  8. Python第一天---第一个Python程序
  9. OpenGL实例:三角形
  10. JavaScript异步编程的Promise模式
  11. python爬虫随笔(2)—启动爬虫与xpath
  12. drawImg、x5浏览器、react
  13. Win32汇编学习(4):绘制文本
  14. 字符编码笔记:ASCII,Unicode 和 UTF-8
  15. 请教JDBC中的thin和OCI的区别\
  16. 45度炸队Alpha冲刺博客集
  17. Linux 下搭建流媒体服务器
  18. BZOJ2654:tree(最小生成树,二分)
  19. 移动端web开发技巧和常见问题
  20. Python基础-redis模块使用

热门文章

  1. Hadoop源码:namenode格式化和启动过程实现
  2. Java 多线程读取文件并统计词频 实例 出神入化的《ThreadPoolExecutor》
  3. 【ORA】ORA-01033,ORA-09968,ORA-01102
  4. kubectl工具管理应用
  5. SAP 修改表和表中数据
  6. Hive常用性能优化方法实践全面总结
  7. 翻译 - ASP.NET Core 基本知识 - Web 主机 (Web Host)
  8. 为什么 TCP 协议有粘包问题
  9. 关于redis搭建环境
  10. Connection Pool