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

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

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

所以跑一遍强连通分量模板,再根据分块后的图找到入度为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. Mysql: if 结构

    if结构 语法 if  条件1  then  语句1; elseif   条件2   then  语句2; ... else 语句n;   # 可以不写 应用场合:应用在begin end 中 SEL ...

  2. html 基础 (9.19 第八天)

    一.HTML:超文本标记语言,是一种标签语言,不是编程语言,显示数据有双标签<body></body> 和单标签<img src=# / >, 标签大小写都可以通过 ...

  3. Mac安装vue产生错误

    npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/webpack/node_modules/_ ...

  4. oracle 的存储过程

    -----推荐视频    https://ke.qq.com/webcourse/index.html#course_id=292495&term_id=100346599&taid= ...

  5. bzoj 1832: [AHOI2008]聚会

    良心题2333 三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233) #include<bits/stdc++.h> #d ...

  6. svg教程

    实例 <html> <body> <h1>My first SVG</h1> <svg style="border: 1px solid ...

  7. python格式字符

  8. 判断单链表是否有环,并找出环的入口python

    1.如何判断一个链表是否有环? 2.如果链表为存在环,如果找到环的入口点? 1.限制与要求 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1). 2.思考 2.1判断是否有环 如果链表有环, ...

  9. PAT Advanced 1003 Emergency (25) [Dijkstra算法]

    题目 As an emergency rescue team leader of a city, you are given a special map of your country. The ma ...

  10. ES6的一些语法

    let, const, class, extends, super, arrow functions, template string, destructuring, default, rest ar ...