返回信息流【 在 LXYXYNT 的大作中提到: 】
: 直接重新构图O(nlogn)求个MST不行么。。
二叉堆Prim O(|E|lg|V|)
快速排序Kruskal O(|E|lg|E|)
他要要O(|V|lg|V|)
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #54225同步于 2015/6/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
Re: 问个g的面试题
jffifa
2015/6/18镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 nuanyangyang 的大作中提到: 】
: “新的mst一定不会用到在原图里却不在原mst里的边”是真的吗?或者能不能找出反例?
聪明
这个其实很容易证明,为了简单起见,假设边权都不相同,考虑kruskal算法(或者类似的拟阵的性质),我们是按照边权从小到大的处理那些边的。一条原图里的边(u,v),之所以不出现在原图的MST里,是因为处理到了它的时候,u和v已经是连通了的。那么对于新图,我们对于所有的边再跑一次kruskal的算法,再处理到边(u,v)时,显然u和v还是已经连通了的,所以它还是不会出现在新图的MST中。
ps:严谨的来说,为什么u和v在新图中还是连通的,是因为在处理(u,v)的前面的边的时候,可以选择的边和点是原来的超集。假设u和v此时是不连通的,那么一定是至少有一条边权比(u,v)小的边,虽然出现在了原图的MST里,但是没有出现在新图的MST时,设这条边为(a,b),而这条边之所以在新图中没有加进去,是因为当考虑到它时,a和b已经是连通了的,在考虑连通性时,这就相当于是加了这条边...
如果这是真的,那么只要对“由原来的节点加上v组成的点集,和原来mst上的边和新的边组成的边集组成的图”求mst就行了。这个图一共只有N+1个节点,最多2*N+1条边,其中n是原来的节点数。这样任何E*log(N)的算法(N和E是点数和边数)就都是N*log(N)了。
【 在 ykprocess 的大作中提到: 】
:
: 聪明
: 这个其实很容易证明,为了简单起见,假设边权都不相同,考虑kruskal算法(或者类似的拟阵的性质),我们是按照边权从小到大的处理那些边的。一条原图里的边(u,v),之所以不出现在原图的MST里,是因为处理到了它的时候,u和v已经是连通了的。那么对于新图,我们对于所有的边再跑一次kruskal的算法,再处理到边(u,v)时,显然u和v还是已经连通了的,所以它还是不会出现在新图的MST中。
: ...................
【 在 nuanyangyang 的大作中提到: 】
: 如果这是真的,那么只要对“由原来的节点加上v组成的点集,和原来mst上的边和新的边组成的边集组成的图”求mst就行了。这个图一共只有N+1个节点,最多2*N+1条边,其中n是原来的节点数。这样任何E*log(N)的算法(N和E是点数和边数)就都是N*log(N)了。
:
bingo