题目链接:http://poj.org/problem?id=2186
题意:奶牛的梦想是成为牛群中最受欢迎的奶牛,即受其它所有牛的欢迎。“欢迎”是具有传递性,即如果牛A认为牛B受欢迎,牛B觉得牛C受欢迎,则牛A也隐含地认为牛C受欢迎。现在,给一组点对 (A,B) 表示 A 认为 B 受欢迎,找出有多少最受欢迎的奶牛。
这是一个有向图上的问题。用图上的顶点表示奶牛,有向边 (A,B) 表示 A 变为 B 受欢迎,则最受欢迎的牛是那些能被其它顶点所到达的顶点。最暴力的解法是,对每一个顶点,判断是否能够为其它所有的顶点所到达。这个算法的复杂度是 O(V2E),其中,V 为顶点数量,E 为有向边的数量。对于题目的数据规模,显然会超时。
实际上,存在 O(V+E) 的算法。这需要我们仔细研究和分析有向图的一些性质。
事实一:如果图上有至少两个顶点的出度为 0,则没有顶点是最受欢迎的,即答案为 0。
显然,如果这个有向图上有环,则环上的奶牛意见一致,即若 C 能被环上的某点所到达,也必然能被环上的其它任意一点所到达。
事实二:每一个强连通子图上的奶牛们意见都一致。
因此,在本题中,我们可以把每一个强连通子图(及它所代表的奶牛群)当做一个整体来看待。若把每个强连通子图看成由该子图的所有顶点能过顶点压缩 (