【代码超详解】POJ 3660 Cow Contest(Floyd 算法(改),思维)

这篇博客详细解析了如何使用Floyd算法的改写版本解决POJ 3660 Cow Contest问题。通过对牛之间的胜负关系建立有向图,并利用算法确定每头牛的排名。文章提供了解题思路,代码编写指导,并附带AC代码。
摘要由CSDN通过智能技术生成

一、题目描述

在这里插入图片描述

二、算法分析说明与代码编写指导

本指导是根据 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。解释如下:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值