【关于memset和0x3f3f3f3f】

当图论中,我们计算最短路径或者最小生成树时,总是喜欢将邻接矩阵或者dist数组初始化为INF。而INF会定义成一个无穷大的常量。众周知,int在计算机中占4字节,32位,所以就有了0x7fffffff,如果仅仅用来比较(求min时赋初值),这是一个很不错的选择。

但是在图论中,经常需要对距离进行更新

dist[j]=min(dist[j],dist[t]+w)

这样的式子是不是很常见。如果这时候INF再加上一个整数就会变成负数啦。

准确来说是无穷大+无穷大!=无穷大。

这时候引入0x3f3f3f3f=1061109567,是10^9级别的,一般的数据也是小于10^9,所以不会出现一个数据大于无穷大的情况。而0x3f3f3f3f+0x3f3f3f3f=2122219134也是无穷大,且没有超过int的范围(2147483647),这就满足了无穷大+无穷大=无穷大

还有一个好处,在memeset清零时,memset(a,0,sizeof a)的效率非常快。但是memeset是按字节来复制的,他会把一个int数的所有字节设置成第二个参数的后8位。

不妨试一下

memset(a,1,sizeof a)

然后打印一下

而我们的0x3f3f3f3f 竟然每一个字节都是0x3f!,这就可以直接用memset复制了。

值得注意的是

memset(a,0x3f,sizeof a)

memset(a,INF,sizeof a)

memset(a,0x3f3f,sizeof a)

memset(a,0x3f3f3f,sizeof a)

memset(a,0x3f3f3f3f,sizeof a)

都会被设置成INF,因为memset是对第一个参数的每一个字节都赋值第二个参数的后八位的。

但是我们在比较的时候

if(dist[j]==INF)

需要注意,这里的const 定义的常量一定要保持0x3f3f3f3f (4个3f哦)

(因为博主de过一个bug,所以想给其他人撑伞。

哭死

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值