ZJNU 1269 - 灯塔——高级
根据题目输入可以得到一个有向图
信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可
但又要考虑可能会出现环这类情况
所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把这些块当作信号发出源,就可以使全图都能够收到信号
所以答案就是入度为0的块的数量
(因为跑完程序刚好卡了时间限制,所以使用了缓冲区读入优化,最终程序耗时78ms)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
const int N=;
vector<int> G[N];
stack<int> S;
int pre[N],lowlink[N],sccno[N],dfs_clock,scc_cnt,ind[N];
const int bsz=<<;
char bf[bsz],*head,*tail;
inline char gc(){
if(head==tail){
int l=fread(bf,,bsz,stdin);
tail=(head=bf)+l;
}
return *head++;
}
inline int read(){
int x=;char c=gc();
while(!isdigit(c))c=gc();
for(;isdigit(c);c=gc())x=x*+c-'';
return x;
}
inline void write(int x){
if(x>=)write(x/);
putchar(x%+'');
}
void dfs(int in){
pre[in]=lowlink[in]=++dfs_clock;
S.push(in);
int num=G[in].size();
for(int i=;i<num;i++){
int v=G[in][i];
if(!pre[v]){
dfs(v);
lowlink[in]=min(lowlink[in],lowlink[v]);
}
else if(!sccno[v])
lowlink[in]=min(lowlink[in],pre[v]);
}
if(lowlink[in]==pre[in]){
scc_cnt++;
while(){
int x=S.top();
S.pop();
sccno[x]=scc_cnt;
if(x==in)
break;
}
}
}
int main(){
int N=read(),M=read(),i,j,a,b;
for(i=;i<M;i++){
a=read();
b=read();
G[a].push_back(b);
}
dfs_clock=scc_cnt=;
memset(sccno,,sizeof sccno);
memset(pre,,sizeof pre);
for(i=;i<=N;i++)
if(!pre[i])
dfs(i);
memset(ind,,sizeof ind);
for(i=;i<=N;i++){
a=G[i].size();
for(j=;j<a;j++)
if(sccno[i]!=sccno[G[i][j]])
ind[sccno[G[i][j]]]++;
}
for(a=,i=;i<=scc_cnt;i++)
if(!ind[i])
a++;
write(a); return ;
}
ZJNU 1269 - 灯塔——高级的更多相关文章
- ZJNU 1367 - Party--中高级
寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索 ...
- ZJNU 1213 - 取水——高级
某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这 ...
- hdu 3047 Zjnu Stadium 并查集高级应用
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- ZJNU 1538 - YN!ngC的取子游戏--高级
Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为 ...
- ZJNU 1333 - 第二题 blocks--中高级
因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...
- ZJNU 1244/1245 - 森哥数——高级
打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最 ...
- ZJNU 1223 - 素数距离——高级
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给 ...
- ZJNU 1217 - 航线问题——高级
将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对 ...
- ZJNU 1205 - 侦探推理——高级
双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意 ...
随机推荐
- js基础学习之-js包装对象
var test = "test"; test.a = "hello"; console.log(test.a); //undifined 定义: 在JavaS ...
- Apache NiFi Processor实战
1 前言 Apache NiFi是什么?NiFi官网给出如下解释:“一个易用.强大.可靠的数据处理与分发系统”.通俗的来说,即Apache NiFi 是一个易于使用.功能强大而且可靠的数据处理和分发系 ...
- java多线程并发(一)-- 相关基础知识
java多线程的知识是java程序员都应该掌握的技能,目前我接触的项目上用的不多,花点时间熟悉熟悉. 一.基础知识 1.什么是进程? 进程是具有一定独立功能的正在运行过程中的程序,是操作系统进行资源分 ...
- window10 家庭版安装docker和php开发环境
前期工作 一.在宿主机创建文件夹 D:\wnmp\mysql57-conf D:\wnmp\mysql57-log D:\wnmp\nginx110-conf D:\wnmp\nginx110-l ...
- 「黑科技」智能消毒防疫机器人 技术方案介绍-disinfection robot
消毒机器人 小新防疫消杀机器人 - 自主导航全方位360°臭氧杀菌消毒机器人,采用臭氧无阻碍.无死角.遍布整个空间除菌:强力涡轮风机,30㎡室内空气循环6次/h,10分钟速效杀菌.除异味.自动转化为氧 ...
- springBoot中的邮件发送
1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- 文献阅读报告 - Situation-Aware Pedestrian Trajectory Prediction with Spatio-Temporal Attention Model
目录 概览 描述:模型基于LSTM神经网络提出新型的Spatio-Temporal Graph(时空图),旨在实现在拥挤的环境下,通过将行人-行人,行人-静态物品两类交互纳入考虑,对行人的轨迹做出预测 ...
- 【每日Scrum】第六天冲刺
一.计划会议内容 数据库仍然有问题,决定先绕过数据库,进行软件内容设计与界面ui美化. 二.任务看板 三.scrum讨论照片 四.产品的状态 无 五.任务燃尽图
- VUE- iView组件框架的使用
VUE- iView组件框架的使用 1. 下载iView 工程. 引用:https://www.iviewui.com/
- Leetcode -- 两数之和Ⅰ
1. 两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 示例:给定 nums = [2, 7, 11, 15 ...