QOJ120 Airline Route Map 题解
这是一道通信题。
系统给 A 发送一张无向图,保证无重边和自环,点数 \(n\le1000\),边数 \(m\le n(n-1)/2\)。
A 需要返回一张新的无向图,需要保证无重边和自环,且新图的点数 \(N\le n+12\)。
系统随机打乱新图的点和边(但没有提到会把 \((u,v)\) 打乱成 \((v,u)\),下发的 grader.cpp 也不会,所以这其实是一张有向图?),再传给 B,即 B 只知道新图的形态。
B 需要返回原图,需要保证点数、边数、每条边连的端点编号相同,但不要求还原边的编号以及边的方向。
先假设题目的意思是,无向边同样会被打乱。
显然原图的边不能动,只需要求出每个点的原始编号即可。容易想到使用 \(10\) 个点来模拟 \(2^0,2^1,\cdots,2^9\),然后利用二进制连边即可确定其余所有点的编号。分别记这十个点为 \(x_0,x_1,\cdots,x_9\)。
但是,这十个点会混入其余 \(n\) 个点中。总共有 \(12\) 个可用点,尝试用剩下的两个点来确定这十个点,分别记为 \(S,T\)。
考虑先找 \(S\),想到可以让它的度数最大,让它和其余所有点连边。但是这样没有任何信息,所以让它和除了 \(T\) 之外的其余所有点连边,这样,如果保证了 \(S\) 的度数最大,B 就可以找到唯一的 \(S\),从而找到 \(T\)。
然后,让 \(T\) 与 \(x_0\sim x_9\) 连边,这样就可以找到这十个点了。
接下来有两个问题:第一个是,如果原图存在一个度数为 \(n-1\) 的点,它又恰好是第 \(511\) 号点,十个点都和它有连边,就无法确定 \(S\) 了。解决方法是直接挖掉 \(511\),也就是按照 \(1,2,\cdots,510,512,\cdots\) 编号。
(进一步地,甚至可以挖去所有 \(\text{popcount}_x\ge9\) 的总共 \(11\) 个点,由于 \(2^{10}-n=24\),挖掉二十三个点都没问题。)
第二个是,我们只找到了十个点,却并不确定它们之间的顺序。连边 \((x_0,x_1),(x_1,x_2),\cdots,(x_8,x_9)\),只需要确定到底是 \(x_0\sim x_9\) 还是 \(x_9\sim x_0\)。找到头和尾所连的点中唯一的那个 \(\text{popcount}=1\) 的点,它就是 \(1\) 号点或者 \(512\) 号点。直接挖掉 \(512\),也就是按照 \(1,2,\cdots,510,513,\cdots\) 编号即可。
进一步地,我们真的需要传原图吗?考虑对每个点随机赋 \(0/1\) 的权值,然后把边的存在性异或上两个端点的权值。A 和 B 可以共享一个固定的随机种子。
这样,每条边都有一半的概率存在,每个点期望度数只有 \(n/2\)。让 \(S\) 向除了 \(x_0\sim x_9\) 的其余 \(n\) 个点连边,这样 \(S\) 就成了度数最大的点,接着看它没连的点就能知道 \(x_0\sim x_9\)。于是 \(T\) 就不需要了,限制被缩小到 \(11\)。
题解说如果允许传有向边,限制可以缩小到 \(1\),但是没说做法。

浙公网安备 33010602011771号