HAOI2006 (洛谷P2341)受欢迎的牛 题解

题目描述

友情链接原题

每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶

牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜

欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你

算出有多少头奶牛可以当明星。

输入输出格式

输入格式:

第一行:两个用空格分开的整数:N和M

第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B

输出格式:

第一行:单独一个整数,表示明星奶牛的数量

输入输出样例

输入样例#1:

3 3
1 2
2 1
2 3

输出样例#1:

1

说明

只有 3 号奶牛可以做明星

【数据范围】

10%的数据N<=20, M<=50

30%的数据N<=1000,M<=20000

70%的数据N<=5000,M<=50000

100%的数据N<=10000,M<=50000

题目分析

这是一道强连通分量的题

首先把样例拿来画一下(解决图论题目常规操作),得到如下的图:

我们可以发现一号和二号可以构成一个强连通分量,然后就会想到tarjan缩点。。把一号和二号缩点后,可以得到如下的图:

我们推论:缩点后出度为零的点为明星牛(假如出度为零的点是一个强连通分量的缩点,那么这个强连通分量中的所有牛都是明星牛)这个其实很好证,假如明星牛的出度不为0,它就会和其他点构成一个强连通分量,那么就是缩点不彻底,而我们讨论的是完全缩点后的情况。

我们在举一个例子

缩点后的图是这样的

这两个点都是出度为0,但是我们发现并没有明星牛。原因是有两个点出度为零。所以推论应该改为:缩点后唯一的出度为0的点是明星牛,这样也可以避免掉单独的点带来的影响。

假如这整个图就是一个强连通图,那么每一头牛都是明星牛(缩点后只有一个点,仍然满足推论)。

然后这个题就简单了,算是裸的tarjan。

附上标程

#include<bits/stdc++.h>
#define maxn 1000000
using namespace std;
int Next[maxn],a=0,F[maxn],Head[maxn];
int cmpi[maxn],out[maxn],E[maxn],cmp[maxn],s[maxn];
int dfn[maxn],low[maxn],top=0,cmpid=0,tim=0;
bool V[maxn],D[maxn];
void ins(int x,int y,int i)
{
E[i]=y;
Next[i]=Head[x];
Head[x]=i;
}//链式前向星
int find()
{
int ans=0;
for(int i=1;i<=a;i++)
{
for(int p=Head[F[i]];p;p=Next[p])//列举这个点的所有邻接点
{
if(!D[E[p]])ans++;//如果这个点的邻接点不和他在一个强联通分量的话,那么我们就发现他所在的分量有了出度
}
}
return ans;
}//找一组强连通分量的出度
void tarjan(int u)
{
dfn[u]=low[u]=++tim;
s[++top]=u;
V[u]=true;
for(int p=Head[u];p;p=Next[p])
{
int y=E[p];
if(!dfn[y])
{
tarjan(y);
low[u]=min(low[y],low[u]);
}
else
{
if(V[y])low[u]=min(low[u],dfn[y]);
}
}
if(dfn[u]==low[u])
{
int y;
cmpid++;
do
{
y=s[top--];
V[y]=false;
F[++a]=y;//将这个点存入暂时数组
D[y]=true;
cmpi[cmpid]++;
}while(y!=u);
cmp[cmpid]=find();//cmp存储他的出度
a=0;
memset(D,false,sizeof(D));//D数组表示这个点在不在这个强连通分量
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
ins(a,b,i);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
int c=0,ans;
for(int i=1;i<=cmpid;i++)
if(!cmp[i])c++,ans=i;//检查图是否连通
if(c==1)printf("%d",cmpi[ans]);//输出
else printf("0");
return 0;
}

HAOI2006 (洛谷P2341)受欢迎的牛 题解的更多相关文章

  1. 洛谷P2341受欢迎的牛

    传送门啦 这是一个tarjan强连通分量与出度结合的例题. 先明确一下题意,如果这个点(缩点之后的)没有出度,这个点才能成为明星牛(明星牛的定义是:所有牛都喜欢他才可以). 由于我们进行了缩点,所以我 ...

  2. 洛谷 [P2341] 受欢迎的牛

    强连通分量 一个结论: 在有向图中, 一个联通块能被所有点遍历当且仅当图中只有一个连通块出度为零 #include <iostream> #include <cstdio> # ...

  3. 【题解】洛谷P2341 [HAOI2006]受欢迎的牛(强连通分量)

    洛谷P2341:https://www.luogu.org/problemnew/show/P2341 前言 这题看错题目 足足花了将近5小时提交了15次 在一位dalao的提醒下才AC了 记得要看清 ...

  4. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  5. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  6. 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)

    洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...

  7. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&q ...

  8. 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows

    P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...

  9. 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)

    P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...

随机推荐

  1. web设计_6_图片/标题/说明文字布局

    这个web中常见的单元布局,最好的布局方式就是利用float布局. 其中有个很关键的问题是需要清浮动.子集浮动是无法撑开父级的高度. 目前较完善的清浮动解决方案:在浮动的父级上添加.clear,达到清 ...

  2. python常用函数进阶(2)之map,filter,reduce,zip

    Basic Python : Map, Filter, Reduce, Zip 1-Map() 1.1 Syntax # fun : a function applying to the iterab ...

  3. java性能优化--字符串优化处理

    String对象 String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象.其实在Java语言中,其设计者也对String做了大量的优化工作,这些也是String对象的特 ...

  4. Linux学习笔记06之DNS

    一.DNS概念:Domain Name System(域名系统) 是互联网上作为域名和IP地址相互映射的一个分布式数据库 二.DNS功能: 完成IP地址和域名之间的一个映射 三.DNS分类: 1.静态 ...

  5. dubbo负载均衡是如何实现的?

    dubbo的负载均衡全部由AbstractLoadBalance的子类来实现 RandomLoadBalance 随机 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀 ...

  6. 记一次paramiko远程连接遇到的坑

    背景:工作中遇到了一个问题,需要用到windows向windows连接(文件传发)以及,linux向windows连接(文件传发)的需求. 自然而然会考虑到用paramiko,然而paramiko我用 ...

  7. 夯实Java基础(十一)——内部类

    1.内部类的概念 内部类顾名思义:将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.对于很多Java初学者来说,内部类学起来真的是一头雾水,根本理解不清楚是个什么东西,包括我自己(我太菜 ...

  8. Unity经典游戏教程之:是男人就下100层

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  9. Spring的数据库编程浅入浅出——不吹牛逼不装逼

    Spring的数据库编程浅入浅出——不吹牛逼不装逼 前言 上文书我写了Spring的核心部分控制反转和依赖注入,后来又衔接了注解,在这后面本来是应该写Spring AOP的,但我觉得对于初学者来说,这 ...

  10. 使用Typora编写博客并发布

    前言 用CSDN写了一段时间,广告漫天飞舞.... 于是在博客园申请了一个账号,然后看见markdown编辑页面的第一眼: 再见^_^ 搜索一波,凭着博客园强大的生态,30多万的用户,第三方的支持应接 ...