首页 > 其他分享 >拓扑排序

拓扑排序

时间:2024-06-03 18:43:49浏览次数:17  
标签:传送 int 拓扑 long constexpr 排序 LL out

题目

现有n扇门,门之间有m种关系,门与门之间可以互相传送。将所有不能被传送到的门视为起点,将不能传送到其他门的门视为终点,利用这些传送关系,求出有多少种路线。
结果可能很大,请对998244353取模。
https://ac.nowcoder.com/acm/contest/82881/B

Input

5 7
2 3
1 2
4 5
1 3
2 5
3 4
3 5

Output

5

说明

共有
5 -> 4 -> 3 -> 2 -> 1
5 -> 4 -> 3 -> 1
5 -> 3 -> 1
5 -> 3 -> 2 -> 1
5 -> 2 -> 1
五条路线

题解

思路分析

STD

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
constexpr int N=5e3+5;
constexpr LL Mod=998244353;
int n,m,in[N],out[N],d[N];
vector<int> e[N];

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;cin>>x>>y;
        in[x]++;
        e[y].push_back(x);
        out[y]++;
    }
    queue<int> q;
    for(int i=1;i<=n;i++){
        if(!in[i]){
            d[i]=1;q.push(i);
        }
    }
    
    while(!q.empty()){
        int t=q.front();
        q.pop();
        for(auto it:e[t]){
            d[it]+=d[t];
            d[it]%=Mod;
            if(!--in[it]) q.push(it);
        }
    }
    LL ans=0;
    for(int i=1;i<=n;i++){
        if(!out[i]){
            ans+=d[i];
            ans%=Mod;
        }    
    }
    
    cout<<ans<<endl;
    return 0;
}

标签:传送,int,拓扑,long,constexpr,排序,LL,out
From: https://www.cnblogs.com/TaopiTTT/p/18229433

相关文章

  • 数据结构学习笔记-希尔排序
    希尔排序的算法设计与分析问题描述:设计并分析希尔排序算法【算法设计思想】选择一个初始的增量序列,通常选择数组长度的一半(n/2)作为初始增量。对于每个增量,将数组分割成若干个子序列,每个子序列的长度等于当前增量。例如,如果增量为5,那么数组将被分割成长度为5的子序列。对......
  • python 探测网络 并自动绘制ip拓扑图
    要实现网络探测并自动绘制IP拓扑图,你可以使用Python与相关库和工具来完成。一个流行的方法是使用Python的网络扫描库(例如Nmap或Scapy)来扫描网络,并使用网络图形库(例如NetworkX和Matplotlib)来绘制IP拓扑图。以下是一个粗略的步骤示例,展示了如何实现网络探测并自动绘制IP拓扑图:i......
  • python NetworkX和Matplotlib 来绘制IP拓扑图
    要使用NetworkX和Matplotlib来绘制IP拓扑图,首先需要使用NetworkX来构建图形,并在图形准备就绪后,使用Matplotlib绘制图形。以下是一个简单的示例,演示了如何使用NetworkX和Matplotlib来绘制IP拓扑图:importnetworkxasnximportmatplotlib.pyplotasplt#创建一个简单的示......
  • 常见的排序算法——快速排序
    本文记述了快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想基于分治思想的快速排序,使用切分函数找到一个切分位置,保证其左侧子范围内的所有元素都不大于切分位置的元素,右侧子范围内的所有元素都不小于切分位置的元素。然后用递归调用......
  • 八大排序:插入、希尔、冒泡、选择、快速、堆、归并、计数
    目录一、插入排序:二、希尔排序:三、冒泡排序:四、选择排序:五、快速排序:    1、霍尔法:    2、挖坑法:    3、前后指针法:    4、非递归的实现:六、堆排序:七、归并排序:1、递归实现:2、非递归实现:八、计数排序:一、插入排序:插入排序......
  • 堆排序-java
    这次主要讲了堆排序和堆的基本构造,下一期会详细讲述堆的各种基本操作。文章目录前言一、堆排序1.题目描述2.堆二、算法思路1.堆的存储2.结点下移down3.结点上移up4.堆的基本操作5.堆的初始化三、代码如下1.代码如下:2.读入数据:3.代码运行结果总结前言......
  • [排序算法]冒泡排序+快速排序全梳理!
    目录前言一、冒泡排序基本思路图解冒泡代码实现代码优化冒泡排序的特性总结:二、快速排序1.hoare版本图解演示代码实现特性总结2.挖坑法基本思路图解过程代码实现特性总结3.前后指针法基本步骤图解过程代码实现特性总结4.快速排序的优化三数取中小区间优化5.非递归实......
  • 数组的降序排序(Java)
    代码:importjava.util.*;publicclasssz{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);//定义数组长度System.out.println("请输入数组的长度:");intlength=scanner.nextInt();......
  • 插入排序详解及Java代码实现
    在计算机科学中,排序是一种基本的操作,它广泛应用于各种数据处理场景。插入排序(InsertionSort)是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的......
  • 冒泡排序与快速排序
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库关注博主带你了解更多数据结构知识1.冒泡排序冒泡排序privatestaticvoidswap(int[]arrary,inti,intj){inttmp=arrary[i];arrary[i]=arrary[j];......