「拓扑排序」可达性统计
时间:2019-09-19
本文章向大家介绍「拓扑排序」可达性统计,主要包括「拓扑排序」可达性统计使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
可达性统计
原题链接:可达性统计
题目大意
给你一张\(n\)个点\(m\)条边的有向无环图,分别统计从每个点出发能够到达的点的数量
题目题解
看到题意就知道要用到拓扑排序,但是拓扑排序的理论复杂度在30000的极限条件下会超时,这个时候我们考虑使用 \(bitset\),一个很好用的代替bool的防卡常技巧,详细的说明这里不说,可以去百度上查看相关运用
//#define fre yes
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N = 30005;
int head[N << 1], to[N << 1], ver[N << 1];
int in[N], ans[N];
std::bitset<N> f[N];
int tot, k;
void addedge(int x, int y) {
ver[tot] = y;
to[tot] = head[x];
head[x] = tot++;
}
int n, m;
void toposort() {
std::queue<int> q;
for (int i = 1; i <= n; i++) {
if(!in[i]) q.push(i);
}
while(!q.empty()) {
int t = q.front(); q.pop();
ans[++k] = t;
for (int i = head[t]; ~i; i = to[i]) {
int v = ver[i];
in[v]--;
if(!in[v]) q.push(v);
}
}
}
int main() {
memset(head, -1, sizeof(head));
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d %d", &u, &v);
addedge(u, v);
in[v] ++;
} toposort();
// for (int i = 1; i <= n; i++) {
// printf("%d ", ans[i]);
// }
for (int i = n; i >= 1; i--) {
int j = ans[i];
f[j][j] = 1;
for (int x = head[j]; ~x; x = to[x]) {
f[j] |= f[ver[x]];
}
}
for (int i = 1; i <= n; i++) {
printf("%d\n", f[i].count());
} return 0;
}
原文地址:https://www.cnblogs.com/Nicoppa/p/11549865.html
- svn 提交代码 自动过滤技巧
- 使用WPF教你一步一步实现连连看(三)
- 网站静态内容出版解决方案
- 如何复制图文消息封面图片?正文没显示
- C#基础知识回顾--线程传参
- 数据库进程间通信解决方案IPC
- 苹果后端的Oracle数据库
- C#基础知识回顾--C#遍历enum类型、获取enum项个数
- 用香蕉也能玩电脑游戏—Tensorflow对象检测接口的简单应用
- 通过图片定位给一张图片添加多个链接
- Struts Interceptor Example
- 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于rxjs里operators filter和map的详细讨论
- 用代码查看SAP Spartacus购物车内的行项目
- rxjs的map和switchMap在SAP Spartacus中的应用
- 用代码查看SAP Spartacus购物车内的行项目
- rxjs fromEvent的用法
- Python2和Python3的区别简单总结
- Django操作数据库
- Hive元数据服务MetaStore
- Linux---Shell脚本字符显示特殊颜色效果
- 快速学习-RocketMQ运维管理
- Django常用语句
- 快速学习-RocketMQ样例
- 快速学习-RocketMQ-“Request-Reply”特性
- 牛逼!Docker遇到Intellij IDEA,再次解放了生产力~
- Go IP 段范围校验