首页 > 其他分享 >164. 可达性统计

164. 可达性统计

时间:2023-05-05 16:47:34浏览次数:36  
标签:idx int 拓扑 ne 164 include 可达性 统计

题目描述

给定一张 N 个点 M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量

f1-拓扑排序+状态压缩

基本分析

  1. 怎么梳理出统计的顺序?拓扑排序
  2. 怎么统计?按照拓扑序的逆序记录可达性
  3. N在30000规模,怎么维护可达性?利用bitset进行状态压缩

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <bitset>

using namespace std;

const int N = 30010, M = 30010;
int n, m;

int h[N], e[M], ne[M], idx;
int seq[N], d[N];
bitset<N>f[N];

void add(int x, int y)
{
    e[idx] = y;
    ne[idx] = h[x];
    h[x] = idx ++ ;
}

void topsort()
{
    queue<int> q;
    for (int i = 1; i <= n; i ++)
    {
        if (d[i] == 0)
            q.push(i);
    }
    
    int k = 0;
    while (q.size())
    {
        int t = q.front();
        q.pop();
        // 记录下拓扑序, 索引-节点
        seq[k++] = t;
        // 遍历节点t的指向的节点
        for (int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];
            if (--d[j] == 0)
                q.push(j);
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    // 记得初始化h数组
    memset(h, -1, sizeof h);
    
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        add(x, y);
        // 记得维护y的入度
        d[y] += 1;
    }
    
    //排序
    topsort();
    
    // 逆序统计节点的链接关系
    for (int i = n-1; i >= 0; i--)
    {
        int t = seq[i];
        f[t][t] = 1;
        for (int j = h[t]; ~j; j = ne[j])
        {
            int k = e[j];
            f[t] |= f[k];
        }
    }
    
    // count统计结果
    for (int i = 1; i <= n; i++)
        printf("%d\n", f[i].count());
        
    return 0;
}

总结

  1. 链式向前星存图
  2. 拓扑排序
  3. bitset进行状态压缩

标签:idx,int,拓扑,ne,164,include,可达性,统计
From: https://www.cnblogs.com/zk-icewall/p/17374517.html

相关文章

  • C++统计代码运行时间
    本来想自己写的,一看github上面都有就不再重复造轮子了。github上的项目如下:StopWatch纯标准库实现:使用std::chrono::high_resolution_clock,其实就是std::chrono::steady_clock的别名。StopWatch类似C#的实现:和C#的StopWatch比较像,在Windows下使用的是QueryPerformanceCounter......
  • 【统计数据分析专论】02-Regularization 正则化
    Regularization正则化课件翻译ModelingNonlinearRelation非线性关系建模上节课学了线性模型但是非线性模型也很重要考虑一个由基函数的线性组合定义的模型在数学中,基函数是函数空间中特定基底的元素。函数空间中的每个连续函数可以表示为基函数的线性组合,就像向量......
  • 雷达数据集 | 使用毫米波FMCW雷达 (AWR1642) 记录的手势数据集
    公众号【调皮连续波】【正文】本文编辑|@小助理     内容审核|@调皮哥1、引言IEEEDataPort是一个数据集库,里面包含了诸多学科和领域的数据集,非常值得大家关注,本期文章就以毫米波雷达手势识别数据集为例向大家介绍这个平台。平台链接如下:https://ieee-dataport.org/dat......
  • "IWR1642单帧串口数据采集" 一些问题与解决
    公众号【调皮连续波】【正文】问题描述:最近,有粉丝在使用TIIWR1642BOOST评估板时,不采用DCA1000,利用单板的串口输出一帧数据时,出现数据显示不全的问题。以下是出现问题时输出的不完全的数据帧:(数据帧的帧头部分经过注释处理,其中的HEX内容和原始数据是一致的)可以看到上述数据帧的总字......
  • C统计单词程序
    C统计单词程序需求描述读取并报告单词的数量计算字符数和行数识别单词的处理把一个单词定义为不含空白的字符序列既:没有空格、制表符、换行符/***@Author:Lucifer*@Date:4/30/2023,2:12:10PM*@LastEditors:Lucifer*@LastEditTime:4/30/2023,2:12:......
  • Pytest统计用例的个数并将测试结果群通知
    背景完成了公司的接口自动化测试,现在需要将测试结果,包括总的用例数、成功用例数、失败用例数等通知到公司的teams群,并且可以查看allure报告代码需要在项目根目录下的conftest.py文件中编写,运行时会自动统计用例,代码如下defpytest_terminal_summary(terminalreporter,exits......
  • 通过Python进行MySQL表信息统计
    在上一篇文章中简单的介绍了使用python-mysql-replication来解析MySQLbinlog来完成实时统计的业务,当然,在现实的业务中不可能用的那么简单的。啰哩八说今天的目的不是介绍真实的业务场景如何使用python-mysql-replication,而是推出一枚<MySQL表信息统计>小工具(笔者通过......
  • wordpress插件:安装使用统计插件Post Views Counter(Post Views Counter 1.3.13 / wor
    一,安装插件搜索到结果后,点击PostViewsCounter的立即安装按钮安装完成后,点击启用按钮启用此插件,如图:说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里获取: https://github.com/liuhong......
  • 通过字典或Series对象进行分组统计
    1.设置商品名称为行索引: 2.根据Series对象进行分组统计: ......
  • 自定义函数实现分组统计
    1.通过自定义的函数实现分组统计: 2.自定义函数,对索引进行修改取不同产品名称的数量: ......