Zhy's Blog~

View My GitHub Profile

Archive
Categories
About

Codeforces Round #335

  CF#335,Virtual participation,题目简单,只有E题让人眼前一亮,然而并不想实现E题...

先按边权排序,从小到大考虑是否属于MST,如果当前边两段分属不同聚类,则属于MST,否则不属于。  

  于是很容易想到其逆向构造的方法:

按边权排序,如果其属于MST,则分属不同聚类,否则属于同一聚类。

  当然,为了构造的简便,我们可以只考虑两种聚类,也就是当前在MST中的,和未考虑的孤立的点。于是构造算法如下:

标记为属于MST的,就向MST中加入一个点,并连接MST中最大的两个点,也就是这个边是(nodecnt,nodecnt-1),此时注意,(nodecnt,nodecnt-k),k>=2均未使用,且是MST内部的点连成的不属于MST的边,可供下一种情况使用。

标记为不属于MST的,使用可用的(n,n-k),其中n<=nodecnt,k>=2,如果当前并没有可以使用的这样的边,那就是-1,不能构造出这样的图G。

  最后要注意一点的是,按边权排序时,如果边权相等,要把属于MST的边排在前面,因为早点往MST中加入点,才能有更多非MST边可用的点对,否则原本可以构造出的图G也会被判断成-1,第7组数据便是hack了这一点
  code

© 个人原创,未经允许,不得转载!

Copyright © 2015-2016 zhyack. All Rights Reserved.

如对文章有任何疑问,请移步问题聚集区一览~