[HAOI2006]受欢迎的牛

Description

每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。

Input

第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)

Output

一个数,即有多少头牛被所有的牛认为是受欢迎的。

Sample Input

3 3
1 2
2 1
2 3

Sample Output

1

HINT

100%的数据N<=10000,M<=50000
 
思路:开始认为可以使用并查集,但是由于给个点有多个父节点,朴素的并查集不行;
这样就需要建图,使用Tarjan对强连通分量进行缩点,之后以缩点作为并查集的元素(只是思想,因为答案要求的只是一部分,所以只看出度即可),看是否只有一个根节点(每一个缩点是环,只要有一个点有一条指向另一个缩点的有向边,那么该缩点中所有的元素都是所指向缩点中点的粉丝);这样只需说明只有一个点出度为0;即只有一个根节点即可;那么该根节点所代表的缩点中点数就是answer;
 
ps:开始认为Tarjan之后对每条边进行遍历;(受hdu2767 Proving Equivalences添边构造强连通图的影响)当边为两个连通分量(缩点)的连边时,就将缩点所代表的点个数进行累加,之后对所有点代入到所在的联通分量(belong)中,看是否集合大小为n(包含了自己);但是这种思想是错误的。因为分析的时候只是看了单独的两个缩点之间的关系;即使使用set排重,但是只是两个缩点之间可以实现排重。这样如果扩展到三个缩点就会发现会出现重复计算;
/********************************************************
Time:88 ms
Memory:2888 kb
****************************************************************/ #include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
const int MAXN = ;
int head[MAXN],tot;
struct edge{
int to,w,Next;
}e[MAXN];
void ins(int a,int b,int w = )
{
e[++tot].Next = head[a];
e[tot].to = b;
e[tot].w = w;
head[a] = tot;
}
const int N = ;
int pre[N],dfs_clock,low[N];
int belong[N],scc,num[N];
stack<int> S;
bool stk[N];
void Tarjan(int u)
{
pre[u] = low[u] = ++dfs_clock;
S.push(u);
stk[u] = true;
int v;//点u所在连通分量的出度;
for(int i = head[u];i;i = e[i].Next){
v = e[i].to;
if(pre[v] == ){
Tarjan(v);
low[u] = min(low[u],low[v]);
}else if(stk[v]){
low[u] = min(low[u],pre[v]);
}
}
if(pre[u] == low[u]){//强连通分量的根节点
++scc;
do{
v = S.top();
S.pop();stk[v] = false;
belong[v] = scc;
num[scc]++;
}while(v != u);
}
}
int id[MAXN];
int main()
{
int T,kase = ;
MS0(head);tot = ;
int n,m,a,b;
scanf("%d%d",&n,&m);
rep0(i,,m){
scanf("%d%d",&a,&b);
ins(a,b);
}
scc = dfs_clock = ;
rep1(i,,n) pre[i] = low[i] = num[i] = belong[i] = ;
rep1(i,,n)if(pre[i] == )
Tarjan(i);
int ans = ;MS0(id);
rep1(u,,n){
for(int index = head[u];index;index = e[index].Next){
int v = e[index].to;
int bv = belong[v],bu = belong[u];
if(bv != bu && id[bu] == ){//***强连通分量之间的连边
id[bu]++;//标记出度不为0的点
}
}
}
rep1(i,,scc)
if(id[i] == ){
if(ans) return puts(""),;
ans = num[i];
}
printf("%d\n",ans);
return ;
}
 
 
 

【BZOJ】1051: [HAOI2006]受欢迎的牛的更多相关文章

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

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

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

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

  3. BZOJ 1051: [HAOI2006]受欢迎的牛( tarjan )

    tarjan缩点后, 有且仅有一个出度为0的强连通分量即answer, 否则无解 ----------------------------------------------------------- ...

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

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

  5. 洛谷 P2341 BZOJ 1051 [HAOI2006]受欢迎的牛

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  6. BZOJ 1051: [HAOI2006]受欢迎的牛

    Description 一个有向图,求所以能被别的点到达的点的个数. Sol Tarjan + 强连通分量 + 缩点. 缩点以后找强连通分量,缩点,然后当图有且仅有1个出度为1的点时,有答案. Cod ...

  7. BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...

  8. bzoj 1051: [HAOI2006]受欢迎的牛 (Tarjan 缩点)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1051 思路: 首先用Tarjan把环缩成点,要想收到所有人的欢迎,那么这个点的出度必为0,且 ...

  9. bzoj 1051 [HAOI2006]受欢迎的牛(tarjan缩点)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051 题解:缩点之后判断出度为0的有几个,只有一个那么输出那个强连通块的点数,否者 ...

  10. 【BZOJ 1051】 1051: [HAOI2006]受欢迎的牛 (SCC)

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

随机推荐

  1. 文件和目录之设置用户ID和设置组ID

    与一个进程相关联的ID有6个或更多,它们如表4-4所示: 表4-4 与每个进程相关联的用户ID和组ID 实际用户ID                            我们实际上是谁 实际组ID ...

  2. 四、IP地址转换

    IP地址与端口 TCP/IP(传输控制协议/网际协议)不是一个协议,而是一组协议的总称,包括IP.TCP.UDP.ICMP.ARP等.它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据 ...

  3. Android Studio编译FBReaderJ

    我的个人环境 系统:mac (windows应该差不多) 工具:android studio 2.1.2 注意:一定要安装NDK!一定要安装NDK!一定要安装NDK!     如何安装NDK     ...

  4. Java基础知识强化之IO流笔记64:合并流SequenceInputStream

    1. SequenceInputStream合并流的概述: SequenceInputStream类可以将多个输入流串联在一起,合并为一个输入流,因此,该流也被称为合并流.   2. Sequence ...

  5. opencv拼接相关1

    这里面都是一些比较杂的东西,没什么实际意义.主要是为了,后面能跑一个程序: Stitcher: 抠细节: http://docs.opencv.org/2.4.2/modules/stitching/ ...

  6. Linux编程简介

    Linux编程可以分为Shell(如BASH.TCSH.GAWK.Perl.Tcl和Tk等)编程和高级语言(C语言,C++语言,java语言等)编程,Linux程序需要首先转化为低级机器语言即所谓的二 ...

  7. [phpmyadmin] phpmyadmin select command denied to user

    phpmyadmin 在查看一个数据库中Table的数据的时候,会提示 select command denied to user 在Ubuntu下,我是使用重装Phpmyadmin的方式解决的 卸载 ...

  8. 去除ActionBar的方法

    今天做一个播放器项目,由于要去除ActionBar,纠结好久,原来这么简单 记录一下 只需要修改AndroidManifest.xml文件中的主题即可 <application android: ...

  9. ajax 跨域的几种方式

    网络上跨域的文章大多一样,这里我写下,巩固下自己的知识,顺便做个记录 什么是跨域 这里简单拿百度的网址做个例子:http://www.baidu.com:80 (默认都是80端口.可省略) http ...

  10. Sql的实际应用

    sql实际应用-递归查询   1.既然要谈到sql,数据库表是必须的   2.数据结构     3.获取某个节点的所有子节点     传统的写法(sql2000) 很麻烦,暂且就不写了     来看看 ...