bzoj1051题解
【题意分析】
给你一张有向图,求有多少个点,满足以其他任意一点为起点都能到达该点。
【解题思路】
如果这张有向图不连通,则一定没有点能被其他所有点到达,答案为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题解的更多相关文章
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
- 【BZOJ1051】[HAOI2006]受欢迎的牛
[BZOJ1051][HAOI2006]受欢迎的牛 题面 bzoj 洛谷 题解 假如\(A\)喜欢\(B\)就连一条\(A\)到\(B\)的边 然后缩点,如果图不连通就\(Impossible\) 否 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
随机推荐
- Springmvc集成CXF请看教程二
转自: http://www.cnblogs.com/xiaochangwei/p/5399507.html 继上一篇webService入门之后,http://www.cnblogs.com/xia ...
- PHP-最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()"输出: 2解释: 最长有效括号子串为 "()" ...
- 为何在新建STM工程中全局声明两个宏
在uVision中新建STM32工程后,需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中,此时需要在工程设置->C/C++选项卡下的Define文本框中键入这两个全局宏定义. STM3 ...
- Hive SQL之分区表与分桶表
Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...
- IO流分类
IO流在java中从输入和输出角度分类: 1.输入流 2.输出流 IO流在java中从数据的角度来分类: 1.字符流:文本,我们能读懂的都可以认为是字符流,如:文章,java文件等 字符输入流的超类: ...
- Java——类的成员之五:内部类
3.6 类的成员之五:内部类 3.6.1 静态内部类 ①静态内部类可以等同看做静态变量. ②内部类重要的作用:可以访问外部类中私有的数据. ③静态内部类可以直接访问外部类的静态数据,无法直接访问成员. ...
- v-on 绑定单个或多个事件
<div id="app07"> <!-- v-on:click 鼠标点击事件--> <a v-on:click="DoSomething& ...
- 天梯L3-003. 社交集群——并查集
在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友.有部分兴趣相同的人们就形成了“社交集群”.现请你编写程序,找出所有的集群. 输入格式: 输入的第一行给出正整数N(&l ...
- Entity Framework 应用程序有以下优缺点
优点: 1.跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换2.提升了开发效率,不需要在编写Sql脚本,但是有些特殊Sql脚本EF无法实现,需要我们自己编写(通过EF中的ExecuteSql ...
- Gerrit(0): Install and Config
Install(Ubuntu 17.04): apt-get install default-jre daemon [nginx] #Other OS: install openjdk8-jre [n ...