#qLTFLybttg030501. 1513:【 例 1】受欢迎的牛

1513:【 例 1】受欢迎的牛

1513:【例 1】受欢迎的牛

题目描述

原题来自:USACO 2003 Fall

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

输入格式

第一行两个整数 N,MN, M

接下来 MM 行,每行两个整数 A,BA, B,表示牛 AA 认为牛 BB 受欢迎(给出的信息有可能重复,即有可能出现多个相同的 (A,B)(A,B))。

输出格式

输出一个整数,表示被除自己之外的所有牛认为是受欢迎的牛的数量。

样例

样例输入 #1

3 3
1 2
2 1
2 3

样例输出 #1

1

样例解释 #1

  • N=3N=3 头牛,M=3M=3 条关系。
  • 关系:121 \to 2212 \to 1232 \to 3
  • 传递性:
    • 11 认为牛 22 受欢迎。
    • 22 认为牛 11 和牛 33 受欢迎。
    • 由于传递性,牛 11 也认为牛 33 受欢迎(因为 1231 \to 2 \to 3)。
  • 检查每头牛是否被除自己之外的所有牛认为受欢迎:
    • 11:牛 22 认为 11 受欢迎,但牛 33 不认为 11 受欢迎(因为没有直接或传递关系从 3311),所以牛 11 不满足。
    • 22:牛 11 认为 22 受欢迎,但牛 33 不认为 22 受欢迎,所以牛 22 不满足。
    • 33:牛 11 认为 33 受欢迎(通过传递),牛 22 认为 33 受欢迎,且除自己外所有牛(1122)都认为 33 受欢迎,所以牛 33 满足。
  • 输出 11

数据范围

对于全部数据:

  • 1N1041 \le N \le 10^4
  • 1M5×1041 \le M \le 5 \times 10^4

时空限制

  • 时间限制:1000 ms
  • 内存限制:65536 KB

注意:本题是强连通分量缩点的经典应用。首先用 Tarjan 算法求出所有强连通分量,然后将每个强连通分量缩成一个点,得到有向无环图(DAG)。在 DAG 中,如果存在唯一的出度为 00 的强连通分量,那么这个强连通分量中的所有牛都是满足条件的(因为其他所有点都能到达该分量,且该分量内的牛相互认为受欢迎)。如果出度为 00 的强连通分量不止一个,则不存在满足条件的牛(因为不同出度为 00 的分量之间不能相互到达)。需要输出该强连通分量的大小。