1051: [HAOI2006]受欢迎的牛

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4573  Solved: 2428
[Submit][Status][Discuss]

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

题目链接:BZOJ 1051

做法:Tarjan缩点后,由于缩点后必定是一个DAG或者叫有向无环图,因此应该至少存在一个出度为0的缩点和一个入度为0的缩点,这题就是要统计出度为0的分量个数

若统计的数量有为1个,则说明全在一个连通分量内,即任意两点互相可达,所有牛都是受欢迎的;若大于1,则说明至少一个连通分量中的牛的数量少于n-1即欢迎不能直接或间接地全部集中在至少一头牛身上,就没有牛受欢迎了

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=10010;
const int M=50010; struct edge
{
int to;
int pre;
};
edge E[M];
int head[N],tot;
int dfn[N],low[N],st[N],belong[N],ins[N],sc,ts,top,scnum[N];
int out[N]; void init()
{
CLR(head,-1);
CLR(low,0);
CLR(dfn,-1);
CLR(belong,0);
CLR(ins,0);
sc=ts=top=0;
CLR(scnum,0);
CLR(out,0);
}
inline void add(int s,int t)
{
E[tot].to=t;
E[tot].pre=head[s];
head[s]=tot++;
}
void Tarjan(int u)
{
dfn[u]=low[u]=++ts;
ins[u]=1;
st[top++]=u;
int v;
for (int i=head[u]; ~i; i=E[i].pre)
{
v=E[i].to;
if(dfn[v]==-1)
{
Tarjan(v);
if(low[v]<low[u])
low[u]=low[v];
}
else if(ins[v])
{
if(dfn[v]<low[u])
low[u]=dfn[v];
}
}
if(dfn[u]==low[u])
{
++sc;
do
{
v=st[--top];
ins[v]=0;
belong[v]=sc;
++scnum[belong[v]];
}while (u!=v);
}
}
int main(void)
{
int n,m,a,b,i,j,u,v;
while (~scanf("%d%d",&n,&m))
{
init();
for (i=0; i<m; ++i)
{
scanf("%d%d",&a,&b);
add(a,b);
}
for (i=1; i<=n; ++i)
if(dfn[i]==-1)
Tarjan(i);
for (u=1; u<=n; ++u)
{
for (j=head[u]; ~j; j=E[j].pre)
{
v=E[j].to;
if(belong[v]==belong[u])
continue;
++out[belong[u]];
}
}
int zero_out=0;
int scindx=-1;
for (i=1; i<=sc; ++i)
{
if(!out[i])
{
++zero_out;
scindx=i;
}
}
zero_out>1?puts("0"):printf("%d\n",scnum[scindx]);
}
return 0;
}

BZOJ 1051 受欢迎的牛(Tarjan缩点)的更多相关文章

  1. bzoj 1051 受欢迎的牛-tarjan

    https://www.lydsy.com/JudgeOnline/problem.php?id=1051 如果A喜欢B,那么A->B连边,那么整个图储存下来,如果有好多个牛是受欢迎的,那么他们 ...

  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 缩点)

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

  4. 【tarjan】BZOJ 1051:受欢迎的牛

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

  5. BZOJ 1051 受欢迎的牛 缩点

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1051 题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数( ...

  6. BZOJ 1051 受欢迎的牛

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

  7. B1051 受欢迎的牛 tarjan缩点

    就是一道tarjan缩点的板子,之前在洛谷做过.但是我发现一个事,就是函数里面有一句话: void tarjan(int x) { dfn[x] = low[x] = ++tot; str[++top ...

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

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

  9. bzoj1051 [HAOI2006]受欢迎的牛 tarjan&&缩点

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

随机推荐

  1. [火狐REST] 火狐REST 模拟 HTTP get, post请求

  2. Fresco 源码分析(三) Fresco服务端处理(2) Producer具体实现的内容

    我们以mProducerFactory.newNetworkFetchProducer()为例,因为这些创建新的producer的方式类似,区别在于是否有包装的处理器,即如果当前处理器中没有正在处理的 ...

  3. 开启InnoDB每表一个独立的表空间

    mysql> show variables like '%innodb%'; +---------------------------------+----------------------- ...

  4. display : -webkit-box-inline 的理解

    发现: 最近在做移动端的东西,说起移动端弹性盒子布局真是无往不利,用起来特别爽,我也是偶尔间发现的这个属性并且它的用法,在网上基本查不到这个属性的资料(个人看法).如果没有听说过(display:bo ...

  5. OAuth2 通用组件源码下载(支持新浪微博、QQ、淘宝)(转载)

    转载地址:http://www.cyqdata.com/download/article-detail-54302 OAuth2 社区通用组件说明:   源码为C#(.NET)写成,目前支持新浪微博. ...

  6. 怎么判定一个mac地址是multicast还是unicast.

    MAC地址是以太网二层使用的一个48bit(6字节十六进制数)的地址,用来标识设备位置.MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique ide ...

  7. js 默认行为取消

    js 默认行为取消   可以简单的  return false;   看需求吧 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transit ...

  8. Jquery鼠标滚动到页面底部自动加载更多内容,使用分页

    index.php代码   [html] view plaincopy <!DOCTYPE html PUBLIC ;}                .single_item{padding: ...

  9. 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义

    今天推荐的文章其实是微软的一篇官方公告,宣布其即将发布的一个支撑高可用高伸缩云服务的框架--Azure Service Fabric. 前两天,微软Azure平台的CTO Mark Russinovi ...

  10. ubuntu下android开发环境安装

    一 安装jdk 网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 新建一个文 ...