当图论中,我们计算最短路径或者最小生成树时,总是喜欢将邻接矩阵或者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,所以想给其他人撑伞。
哭死