POJ1679 The Unique MST

最小生成树唯一性问题

Memory: 824K Time: 157MS
https://code.csdn.net/snippets/1632570

题意

RT.输入一张图,判断它的最小生成树是否唯一。
如果唯一,则输出这个生成树的值。否则输出Not Unique!

分析

如果最小生成树不是唯一的,那么肯定存在另一棵MST,它的边和第一次求出的MST不完全相同,但是值的和一样。
所以,求出第一棵树,枚举它的每一条边,删除之,再求MST,值相同则不唯一(此时求出的这棵新树即为另一棵MST)。如果值不同,记着把这条边恢复回去,再试其他边。

出现的问题

  1. 没注意到是无向图(纯粹是秀逗)
  2. 算完一组数据忘了清空edge[].del=false WA
  3. 去掉边后整张图可能变得不连通,这时求出的最小生成树值无意义。数据里刚好有不连通图没考虑到就Not Unique的,所以WA
    解决方案:求完mst,看是不是加入了所有点(Prim)
for(int i=1; i<=n; ++i)
        if(!vis[i]) return 0x3f3f3f3f;

技巧

1.同一个求最小生成树的算法过程,可以记录边,可以不记录边。

inline int prim(int *sav=0)
//传入sav则保存边,否则不保存
if(sav) *(sav++)=e;

2.特别的存储方式,正向边反向边快速转换
通过^1的方式,同时删除一对边

for(int i=1; i<=m; ++i)
{
    //...
    addedge(2*i, s, t, w);
    addedge(2*i+1, t, s, w);
}
//...
for(int i=1; i<=n-1; ++i)
{
    edge[mst[i]].del=true;
    edge[mst[i]^1].del=true;
    //...
    edge[mst[i]].del=false;
    edge[mst[i]^1].del=false;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值