一、题目描述
二、算法分析说明与代码编写指导
本指导是根据 https://www.cnblogs.com/cenariusxz/p/4785217.html 改写的。
令 u 到 v 的有向边代表牛 u 胜牛 v。如果对一头牛,能够通过这样建立起来的图确定一定比它强的和一定比它弱的牛的数量加起来共有 n - 1 个,那么这头牛的总排名就唯一确定了。
对任意一头牛我们都要这样确定,可以考虑基于 Floyd 算法进行修改。Floyd 算法能确定任意两点间的最短路长度。如果点 u 到点 v 存在最短路,就意味着拓扑序中 u 比 v 靠前。
能在图上确定 u 比 v 靠前,意味着存在至少一条 u 到 v 的路径,或者说 u 到 v 存在最短路。不过在本题中我们不再求最短路了,而是将算法改写。输入边 <u, v> 的时候能直接确定 g[u, v] = 1,代表 u 和 v 直接相连。那么对间接相连的情况,虽然点 i 和 j 不相连,但是点 i 与点 k 相连,点 k 与点 j 相连,此时 i 到 j 至少存在路径 i → k → j。在三重循环中,执行
if (g[i][k] && g[k][j])g[i][j] = 1;
即可。可以发现,执行完毕后只要 i 到 j 存在任意长的路径,那么就有 g[i, j] = 1。解释如下: