首页 > 其他分享 >洛谷题单指南-图的基本应用-P4017 最大食物链计数

洛谷题单指南-图的基本应用-P4017 最大食物链计数

时间:2024-03-28 13:57:20浏览次数:10  
标签:食物链 入度 int 洛谷题 出度 路径 P4017 节点

原题链接:https://www.luogu.com.cn/problem/P4017

题意解读:食物链的顶端不会被其他生物吃,在图结构中设定为入度是0,食物链的底端不会吃其他生物,在图结构式设定为出度是0,此题就是要计算所有入度是0的点到所有出度是0的点一共有多条路径。

解题思路:

首先,来模拟一样样例,样例数据形成的图如下:

在此图中,食物链的顶端是1,食物链的底端是5,要求1->5的所有路径数,其实就是求有多少条路可以到达5

设数组l[N]为顶端到每个节点的路径条数

节点5可以从2、3、4过来,因此l[5] = l[2] + l[3] + l[4]

节点2可以从1过来,l[2] = l[1],节点1的路径数就是1,l[1] = 1,所以l[2] = 1

节点3可以从1、2过来,l[3] = l[2] + l[1] = 1 + 1 = 2

节点4可以从3过来,l[4] = l[3] = 2

所以l[5] = 1 + 2 + 2 = 5

以上过程,其实本质上,就是计算到每个节点的路径条数。

在拓扑排序的过程中,会先搜索完某个节点所有的前置节点,这个过程就可以计算到这个节点的路径数,等于到所有前置节点路径数之和,

到所有顶端节点(入度为0)的路径数都初始化为1即可,

另外,注意底端节点可能有多个,要把到所有出度为0的节点路径数加起来。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 5005;
const int MOD = 80112002;

vector<int> g[N];
queue<int> q;
int in[N], out[N]; //入度、出度
int l[N]; //到每个节点的路径条数
int n, m, a, b;
int ans;

void bfs()
{
    for(int i = 1; i <= n; i++)
    {
        if(in[i] == 0)
        {
            q.push(i);
            l[i] = 1; //到入度为0的节点的路径数是1
        }
    }
    while(q.size())
    {
        int u = q.front(); q.pop();
        for(int i = 0; i < g[u].size(); i++)
        {
            int v = g[u][i];
            if(--in[v] == 0) q.push(v);
            l[v] = (l[v] + l[u]) % MOD; //到v的路径条数就是到所有前置节点的路径条数之和
        }
    }
}

int main()
{
    cin >> n >> m;
    while(m--)
    {
        cin >> a >> b;
        g[b].push_back(a);
        in[a]++; //记录入度
        out[b]++; //记录出度
    }
    bfs();
    for(int i = 1; i <= n; i++)
    {
        if(out[i] == 0)
        {
            ans = (ans + l[i]) % MOD; //计算到所有出度为0的节点的路径数之和
        }
    }
    cout << ans;

    return 0;
}

 

标签:食物链,入度,int,洛谷题,出度,路径,P4017,节点
From: https://www.cnblogs.com/jcwy/p/18101493

相关文章

  • 洛谷题单指南-图的基本应用-P3916 图的遍历
    原题链接:https://www.luogu.com.cn/problem/P3916题意解读:寻找每个点所能到达的最大的点。解题思路:直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图,从最大值出发,所经过的点能达到......
  • 洛谷题单指南-图的基本应用-P5318 【深基18.例3】查找文献
    原题链接:https://www.luogu.com.cn/problem/P5318题意解读:图的建立、DFS、BFS模版题。解题思路:本题主要考察建图、图的DFS、BFS遍历。建图方式:领接表vector<int>g[N];需要注意的是,在DFS、BFS搜索领接点时,需要先将领接点编号排序,满足题目要求的“如果有很多篇文章可以参阅,请......
  • 洛谷题单指南-集合-P2814 家谱
    原题链接:https://www.luogu.com.cn/problem/P2814题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。解题思路:由于存在真正的父子关系,所以在并查集合并的时候,要把p[x]=y中x设置为子,y设置为父,其余都是并查集的常规操作。由于是计算姓名之间的父子关系,并查集可以用map......
  • 洛谷题单指南-集合-P3879 [TJOI2010] 阅读理解
    原题链接:https://www.luogu.com.cn/problem/P3879题意解读:此题本质上是计算倒排索引,所谓倒排索引,即不是通过文章来找单词,而是通过单词来找文章。解题思路:要建立单词和文章之间的关系,一个单词对应多篇文章,且要按照文章编号排序,可以使用如下数据结构:map<string,set<int>>h;只......
  • 洛谷题单指南-集合-P1955 [NOI2015] 程序自动分析
    原题链接:https://www.luogu.com.cn/problem/P1955题意解读:要判断约数条件是否可以同时满足,主要是要判断不相等的情况。解题思路:对于相等的条件,直接进行集合合并即可;对于不相等的条件,判断两者是否属于同一个集合,如果形成矛盾,则条件不能成立。由于i,j的范围至10^9,定义并查集如果......
  • 洛谷题单指南-集合-P1892 [BOI2003] 团伙
    原题链接:https://www.luogu.com.cn/problem/P1892题意解读:此题与关押罪犯问题非常像,本质上就是要合并所有的朋友。解题思路:首先,初始化并查集;对于每一对人的关系,如果是朋友,直接进行合并;如果是敌人,先查看双方之前是否有记录其他敌人,如果有,则将一方与另一方的敌人进行合并,如果没......
  • 洛谷题单指南-集合-P1621 集合
    原题链接:https://www.luogu.com.cn/problem/P1621题意解读:a~b之间的数,把有大于等于p的公共质因数的数进行合并作为一个集合,求一共有多少个集合。解题思路:要进行集合合并、统计集合数,可以使用并查集,有两种做法:1、暴力法80%的数据在1000范围内,因此通过双重循环枚举,判断两个数的......
  • 洛谷题单算法1-6二分查找与二分答案
    代码仅供参考,不足之处望理解。P2249【深基13.例1】查找#include<iostream>usingnamespacestd;constintN=1e6+5;intn,m,a[N];intmain(){ios::sync_with_stdio(false);//输入cin>>n>>m;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1......
  • C语言:洛谷题目分享(4)小书童--凯撒密码和笨小猴
    目录1.前言2.俩道题目1.小书童--凯撒密码1.题目背景2.题目描述3.输入格式4.输出格式5.题解2.笨小猴1.题目描述2.输入格式3.输出格式4.题解3.小结1.前言哈喽大家好啊,今天我继续为大家分享洛谷题单的俩道题目,请大家多多支持喔~2.俩道题目1.小书童--凯撒密码......
  • 洛谷题单指南-集合-P1525 [NOIP2010 提高组] 关押罪犯
    原题链接:https://www.luogu.com.cn/problem/P1525题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。解题思路:首先,要让冲突影响最小化,显然应该把仇恨大的罪犯......