切水题,写题解~

tarjan缩一波点,然后

  • 只有一个出度为0的点:他的size就是答案

  • 有多个初度为0的点:无解,0个

因为是强联通分量,所以肯定有出度为0的点,否则——就是你tarjan写挂了~

\[Talk\;is\;free\;,\;show\;me\;the\;code
\]

#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>
#define MAXN 200000
using namespace std ;
inline void read(int &x) {
char ch=getchar();
int s=0,f=1;
while (!(ch>='0'&&ch<='9')) {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
s=(s<<3)+(s<<1)+ch-'0';
ch=getchar();
}
x=s*f;
}
vector<int> edge[MAXN] ;
int ins[MAXN] , low[MAXN] , dfn[MAXN] ;
int tot , whr[MAXN] ;
vector<pair<vector<int>,vector<int> > > scc ;
int deg[MAXN] ;
int n , m ;
void add(int u,int v){
edge[u].push_back(v) ;
}
void print(stack<int> s){
vector<int> sns ; sns.clear() ;
while(!s.empty()){
cerr<<s.top()<<" " ; s.pop() ;
}
cerr<<endl ;
}
stack<int> idx ;
vector<int> ptpuntil(int v , int wr){
//print(idx) ;
vector<int> nodes ;
while((!idx.empty())&&idx.top()!=v)
nodes.push_back(idx.top()) , whr[idx.top()] = wr , idx.pop() ;
nodes.push_back(idx.top()) , whr[idx.top()] = wr , idx.pop() ;
return nodes ;
} int totally = 1 ;
void tarjan(int node){
dfn[node] = low[node] = ++totally ; ins[node] = 1 ; idx.push(node) ;
for(auto& i:edge[node]){
if(dfn[i]==0){
tarjan(i) ;
low[node] = min(low[node] , low[i]) ;
}
else if(ins[node]==1){
low[node] = min(low[node] , dfn[i]) ;
}
}
if(dfn[node]==low[node]){
//cout<<"NODE "<<node<<endl ;
scc.push_back(make_pair(ptpuntil(node,scc.size()),vector<int>())) ;
}
}
void _add(int a,int b){
if(a!=b) scc[a].second.push_back(b) ;
}
void join(){
//cerr<<"JOIN WORKS!"<<endl ;
//cerr<<"n = "<<n<<endl ;
for(int i=1;i<=n;++i)
for(auto& j : edge[i])
_add(whr[i],whr[j]) ;
for(auto& i : scc) sort(i.second.begin(),i.second.end()) , unique(i.second.begin(),i.second.end()) ;
}
void print(vector<int> V){
for(auto& i : V) cerr<<i<<" " ;
}
void print(vector<pair<vector<int> , vector<int> > > V){
int m = 0 ;
for(auto& i : V){
cerr<<"Vector No."<<++m<<":\n\tfirst :" ;
print(i.first) ;
cerr<<"\n\tsecond:" ;
print(i.second) ;
cerr<<endl ;
}
}
void answer(){
join() ;
//print(scc) ;
vector<int> zrs ;
zrs.clear() ;
for(int i=0;i<scc.size();++i){
if(!scc[i].second.size()) zrs.push_back(i) ;
//cout<<"PUSH "<<i<<endl ;
}
if(zrs.size()>1) printf("0\n") ;
else {
printf("%d\n",scc[*zrs.begin()].first.size()) ;
}
}
int main(){
read(n) , read(m) ;
for(int i=1;i<=m;++i){
int x , y ; read(x) , read(y) , add(x,y) ;
}
for(int i=1;i<=n;++i){
if(!dfn[i]) totally = 0 , tarjan(i) ;
}
answer() ;
}

题解【[HAOI2006]受欢迎的牛】的更多相关文章

  1. BZOJ 1051: [HAOI2006]受欢迎的牛 缩点

    1051: [HAOI2006]受欢迎的牛 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

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

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

  3. bzoj1051: [HAOI2006]受欢迎的牛(强联通)

    1051: [HAOI2006]受欢迎的牛 题目:传送门 题解: 今天又做一道水题... 强联通啊很明显 水个模板之后统计一下每个强联通分量中点的个数,再统计一下出度... 不难发现:缩点之后当且仅当 ...

  4. BZOJ 1051: [HAOI2006]受欢迎的牛(SCC)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8172  Solved: 4470[Submit][Sta ...

  5. P2341 [HAOI2006]受欢迎的牛(更完)

    P2341 [HAOI2006]受欢迎的牛 题解 tarjan 缩点板子题 如果 A 稀饭 B,那就 A 向 B 连边,构造出一个有向图 如果这个有向图里有强连通分量,也就说明这个强连通分量里的所有奶 ...

  6. bzoj1051 [HAOI2006]受欢迎的牛

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4773  Solved: 2541[Submit][Sta ...

  7. 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数

    [bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...

  8. 1051: [HAOI2006]受欢迎的牛

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2276  Solved: 1190[Submit][Sta ...

  9. 【BZOJ】1051: [HAOI2006]受欢迎的牛

    [HAOI2006]受欢迎的牛 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢 ...

  10. bzoj 1051: [HAOI2006]受欢迎的牛 tarjan缩点

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2092  Solved: 1096[Submit][Sta ...

随机推荐

  1. 无法执行 BACKUP LOG,因为当前没有数据库备份,导入数据库备份.bak文件

    右键数据库——>任务——>还原——>数据库 无法执行 BACKUP LOG,因为当前没有数据库备份 结尾日志的问题 还原选择中去掉结尾日志就可以了

  2. JPA#ManyToMany

    多对多,多个学生选了多个课程. 涉及到的注解(注解的使用看注释):ManyToManyJoinTableJsonIgnoreProperties @Entity @Table(name = " ...

  3. Flask—路由的注册方法

    第一种注册方法 from flask import Flask app = Flask(__name__) @app.route("/hello") # 第一种注册方法 def h ...

  4. (1)关于PSP寄存器和MSP寄存器的简单描述

    由于 Cortex-M3 和 M4 内核具有双堆栈指针, MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP任务堆栈指针也是可以的.在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系 ...

  5. 使用NlohmannJson写JSON保留插入顺序

    1. 正文 nlohmann/json是一个C++的读写JSON的组件,号称使用现代C++范式写的.简单看了一下,这个组件确实包含了很多cpp11以上的特性,在vs2015及一下的版本甚至没办法正常编 ...

  6. C# Stream篇(六) -- BufferedStream

    BufferedStream 目录: 简单介绍一下BufferedStream 如何理解缓冲区? BufferedStream的优势 从BufferedStream 中学习装饰模式 如何理解装饰模式 ...

  7. GS 原理及破解 《0day安全》

    1.原理: 在main函数之前,会调用__security_init_cookie函数(win10,vs2017,release,x86): 进入__security_init_cookie函数内部: ...

  8. PyTorch实战:经典模型LeNet5实现手写体识别

    在上一篇博客CNN核心概念理解中,我们以LeNet为例介绍了CNN的重要概念.在这篇博客中,我们将利用著名深度学习框架PyTorch实现LeNet5,并且利用它实现手写体字母的识别.训练数据采用经典的 ...

  9. 对DataFrame的再理解

    1.构造需要从字典构造 cds={'code':["002372.XSHE","002415.XSHE","002304.XSHE",&qu ...

  10. React yarn安装umi后 umi -v查询版本失败

    采坑描述:yarn全局安装模块后但仍提示无法找到 解决: 1.先查看一下yarn的bin目录,输入yarn global bin 2.然后将该路径加入到path中,对于windows中直接将该目录加入 ...