【题意分析】

  给你一张有向图,求有多少个点,满足以其他任意一点为起点都能到达该点。

【解题思路】

  如果这张有向图不连通,则一定没有点能被其他所有点到达,答案为0。

  然后先用tarjan缩一波强连通分量,因为每个强连通分量中任意两点能相互到达,所以整体可以看成一个点。

  因为已经保证图的连通性,所以只要统计没有入度的强连通分量的点数和即可。复杂度O(n+m)。

【参考代码】

 #include <cctype>
#include <cstdio>
#define REP(I,start,end) for(int I=(start);I<=(end);I++)
#define PER(I,start,end) for(int I=(start);I>=(end);I--)
typedef long long LL;
inline int getint()
{
char ch=getchar();
for(;!isdigit(ch)&&ch!='-';ch=getchar());
bool impositive=ch=='-';
if(impositive)
ch=getchar();
int result=;
for(;isdigit(ch);ch=getchar())
result=(result<<)+(result<<)+ch-'';
return impositive?-result:result;
}
inline LL getLL()
{
char ch=getchar();
for(;!isdigit(ch)&&ch!='-';ch=getchar());
bool impositive=ch=='-';
if(impositive)
ch=getchar();
LL result=0ll;
for(;isdigit(ch);ch=getchar())
result=(result<<)+(result<<)+ch-'';
return impositive?-result:result;
}
template<typename T> inline bool getmax(T &target,T pattern)
{
return pattern>target?target=pattern,true:false;
}
template<typename T> inline bool getmin(T &target,T pattern)
{
return pattern<target?target=pattern,true:false;
}
//Header Template
#include <cstring>
#include <vector>
using namespace std;
bool instack[],visited[],ind[];
int n,cardP,top,cnt,dfn[],low[],SCC[],Ssize[],stack[];
vector<int> edge[],dedge[];
inline bool BFS()
{
memset(visited,,sizeof(visited));
stack[]=visited[]=;
for(int head=,tail=;head++<tail;)
{
int now=stack[head];
for(int i=;i<dedge[now].size();i++)
{
int p=dedge[now][i];
if(!visited[p])
{
stack[++tail]=p;
visited[p]=true;
}
}
}
bool result=true;
REP(i,,n)
result&=visited[i];
return result;
}
void Tarjan(int now)
{
dfn[now]=low[now]=++cardP;
stack[++top]=now;
instack[now]=visited[now]=true;
for(int i=;i<edge[now].size();i++)
{
int p=edge[now][i];
if(!visited[p])
{
Tarjan(p);
getmin(low[now],low[p]);
}
else
if(instack[p])
getmin(low[now],dfn[p]);
}
if(low[now]==dfn[now])
{
Ssize[++cnt]=;
while(top&&instack[now])
{
int p=stack[top--];
instack[p]=false;
SCC[p]=cnt;
Ssize[cnt]++;
}
}
}
int main()
{
n=getint();
memset(edge,,sizeof(edge));
memset(dedge,,sizeof(dedge));
for(int m=getint();m--;)
{
int u=getint(),v=getint();
edge[v].push_back(u);
dedge[u].push_back(v);
dedge[v].push_back(u);
}
if(!BFS())
{
putchar('');
putchar('\n');
return ;
}
cardP=top=cnt=;
memset(visited,,sizeof(visited));
memset(instack,,sizeof(instack));
REP(i,,n)
if(!visited[i])
Tarjan(i);
memset(ind,,sizeof(ind));
REP(i,,n)
for(int k=;k<edge[i].size();k++)
{
int j=edge[i][k],scc=SCC[j];
ind[scc]|=SCC[i]!=scc;
}
int ans=;
REP(i,,cnt)
ans+=(!ind[i])*Ssize[i];
printf("%d\n",ans);
return ;
}

bzoj1051题解的更多相关文章

  1. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  2. 【BZOJ1051】[HAOI2006]受欢迎的牛

    [BZOJ1051][HAOI2006]受欢迎的牛 题面 bzoj 洛谷 题解 假如\(A\)喜欢\(B\)就连一条\(A\)到\(B\)的边 然后缩点,如果图不连通就\(Impossible\) 否 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

随机推荐

  1. SQL的多表查询(Navicat)

    -- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 loc VA ...

  2. Linux系统上安装MySQL 5.5prm

    http://www.cnblogs.com/sunson/articles/2172086.html

  3. Repeatable Read

    在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题. 幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能 ...

  4. PHP FILTER_SANITIZE_MAGIC_QUOTES 过滤器

    定义和用法 FILTER_SANITIZE_MAGIC_QUOTES 过滤器对字符串执行 addslashes() 函数. 该过滤器在预定义的字符串前面设置反斜杠. 预定义字符是: 单引号(') 双引 ...

  5. 经典sql题练习50题

    -- 1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数 select a.* ,b.s_score as 01_score,c.s_score a ...

  6. PHP 图形验证码

    一段生成图形验证码的代码,向原创作者致谢. 1.将以下代码保存为 txm.php ,注:直接运行该页面是没有结果的,要用另一页面引用,请看步骤2 <?php session_start(); $ ...

  7. JS 变量 相关内容

    JS变量按存储方式区分为哪些类型?: js变量按照存储方式分为两种类型:值类型 和 引用类型 1.值类型(基本类型): 布尔值(boolean) . null .undefined .数值(numbe ...

  8. Django+paramiko实现webshell

    说明 基于 python3.7 + django 2.2.3 实现的 django-webshell,支持颜色显示,支持 tab 命令补全,项目地址:https://github.com/leffss ...

  9. Jquery的Ready方法加载为什么两次?

    Ready方法会调用两次? 查看对应的页面是否存在<iframe src="#" --> 存在iframe加载这个页面的时候,页面就会加载两次. $(document) ...

  10. python_way day15 HTML-DAY2、 回顾HTML-CSS 标签(css强制生效),JS(数据类型,时间处理,作用域)

    python_way day15 HTML-DAY2 html-css回顾 javascript 一.html-css回顾 增加默认值: . 强制生效,就算在上面,被覆盖上了也会生效 解决缩小页面混乱 ...