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 ...
随机推荐
- ubuntu安装及破解WebStorm11
ubuntu安装及破解WebStorm11 下载地址:http://www.jetbrains.com/webstorm/download/#section=linux-version 1.qingy ...
- mysql类型转换函数convert与cast的用法,及SQL server的区别
首先,convert函数 字符集转换 : CONVERT(xxx USING gb2312) 类型转换和SQL Server一样,不过类型参数上有不同: CAST(xxx AS 类型) ...
- vue static和assets的区别
static和assets的区别,原理就在于webpack是如何处理静态资源的 assets 1)在vue组件中,所有模板和css都会被vue-html-loader和css-loader解析,并查找 ...
- bootstrap 好看的上传组件
<!DOCTYPE html> <html> <head> <title></title> <link rel="style ...
- JAVA学习之环境搭建
了解到JAVA语言的跨平台性的原理是通过在不同的操作系统中安装对应版本的的JAVA虚拟机(JVM)实现 开发JAVA前必须先搭建JAVA环境: 1.JAVA开发工具包JDK(JAVA DEVELOPM ...
- PAT_A1084#Broken Keyboard
Source: PAT A1084 Broken Keyboard (20 分) Description: On a broken keyboard, some of the keys are wor ...
- 将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
- Java并发主要操作
核心Java提供对多线程程序的完全控制. 也可以开发一个可以根据您的要求完全暂停,恢复或停止的多线程程序. 有各种静态方法可以用于线程对象来控制它们的行为. 下表列出了这些方法 - 编号 方法 说明描 ...
- response和ServletContext和乱码问题
服务器端以/开始就代表当前项目名客户端必须以 /项目名/资源 才能定位到资源 软件与软件之间,以字符为标准传递,传递字节,接收端自己按原来的编码集编码之后再按照自己的编码集解码编码(如果没有对应字符, ...
- kafka原理概念提炼
Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...