根据题目输入可以得到一个有向图

信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可

但又要考虑可能会出现环这类情况

所以跑一遍强连通分量模板,再根据分块后的图找到入度为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 - 灯塔——高级的更多相关文章

  1. ZJNU 1367 - Party--中高级

    寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索 ...

  2. ZJNU 1213 - 取水——高级

    某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这 ...

  3. hdu 3047 Zjnu Stadium 并查集高级应用

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  4. ZJNU 1538 - YN!ngC的取子游戏--高级

    Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为 ...

  5. ZJNU 1333 - 第二题 blocks--中高级

    因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...

  6. ZJNU 1244/1245 - 森哥数——高级

    打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最 ...

  7. ZJNU 1223 - 素数距离——高级

    因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给 ...

  8. ZJNU 1217 - 航线问题——高级

    将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对 ...

  9. ZJNU 1205 - 侦探推理——高级

    双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意 ...

随机推荐

  1. 第二十一篇 关联管理器(RelatedManager)

    关联管理器(RelatedManager) lass RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: Forei ...

  2. 创建简单web项目

    Intellij Idea直接安装(可根据需要选择自己设置的安装目录),jdk使用1.6/1.7/1.8都可以,主要是配置好系统环境变量,tomcat7上tomcat的官网下载压缩包解压即可. 一.创 ...

  3. 安卓app测试之Monkey日志分析《转载》

    安卓app测试之Monkey日志分析 链接:https://www.cnblogs.com/wuzm/p/10965762.html

  4. python--多线程的应用

    python 多线程执行函数,以及调用函数时传参 import threading def func1(): print('this is function1') def func2(x,y): pr ...

  5. Java学习笔记(一) 面向对象---封装

    面向对象---封装 封装是面向对象思想的三大特征之一. 理解: 隐藏对象的属性和实现细节,仅对外提供公共访问方式. 优点: 将变化隔离 便于使用 提升代码复用性 提高安全性 封装原则: 将不需要对外提 ...

  6. 【转】CSS实现自适应分隔线的N种方法

    1.伪元素+transform:translateX(-100%); 主要原理是设置文本居中text-align: center;,然后给定两个伪元素,分别绝对定位,那么此时伪元素也是跟随着水平居中的 ...

  7. swift之保存数据到keychain

    访问KeyChain 1.在mac上按下 Command+Space 输入Keychain Access 2.在终端输入security find-generic-password -help 读取配 ...

  8. 计划任务常用在线工具-微服务信息整-seafile网盘-亿图操作-正则工具

    正则工具 https://regex101.com/ http://www.regexp.cn/Regex 身份证匹配 ^(\\d{}|\d{})(\\d|[xX])$ \d{}[-9Xx]|\d{} ...

  9. Caused by: com.mysql.cj.exceptions.DataReadException: Zero date value prohibited

    原因:数据库日期出现零值,即0000-00-00 属于一个无效日期. 解决方案:重新赋值,或者在jdbc链接后加参数zeroDateTimeBehavior=convertToNull

  10. SpringBootStarter种类

    Name Description spring-boot-starter 核心starter, 包括auto-configuration支持, logging和YAML 支持 spring-boot- ...