[POJ 2186]

Popular Cows

题目大意:一个有向图,边(i,j)表示牛i认为牛j受欢迎,这种关系具有传递性。问:图中存在多少只牛被其他所有牛认为是受欢迎的?

很喜欢这种题……简洁的题面和清晰的题意,但足够一想想一天的。

思路是求强连通分支后缩点,再判断缩点后是否存在唯一出度数为0的点(也即最受欢迎牛群k),然后再判在反向图中,是否其余缩点从点k出发都可达。这里有个坑:如果总共只有一只牛,直接输出0。

具体实现上,分别尝试使用了CLRS上的两次DFS和tarjan来求强连通分支。另外,这题也是第一次写缩点,用了并查集,感觉有点累赘。

两次DFS:

tarjan(总感觉自己敲的东西有种山寨感?):

两种算法的耗时相近,但是两次DFS怎么会和一次DFS的tarjan差不多呢?实在不太明白…