Zoj 3509

       这是zoj五一的比赛最后一题,比赛的时候没想出来,比赛后从神牛博客 watashi 看到解题思路,再来自己写一写。

     题目大意:在有n个岛之间建桥,输入m个操作,每个操作有三种格式,I a b表示在a,b之间建立桥,D a b表示摧毁a,b之间的桥,Q a b表示询问a,b是否连通,连通输出YES,不连通输出NO,数据范围(n<=500, m<=50000),多组测试数据,要求在每组测试数据之间输出一个空行。

      解题:如果直接做这个题,肯定会超时,因为用DFS检测两点是否连通时间复杂度是O(e),本题边很多,所以要超时。但是本题点少,只有500,要求两点是否连通只需保留这幅图的生成树即可,这样就可以控制边数最多是n-1,DFS时间复杂度变成了O(n);对于加边操作,如果a,b不连通,就直接加上a,b这条边即可,若已经连通,加上这条边就会有回路,那么把这个回路中将最早被删除的边提前删除,这样是不会影响后面的操作的;对于删除操作,若已经提前删除,就算了,没有删除就删除即可。要想知道回路中的哪条边会最早被删掉,只需先读入所有的操作,记录一下即可。这样对于每次操作时间复杂度都是O(n),m次操作,本题时间复杂度即为O(nm).

       在明白思路之后,用我可怜的c语言写出了代码,提交发现还是超时,再优化一下成了"Segmentation Fault",看神牛代码(c++),......越来越发现还是c++强大,各种模板,直接调用,可怜的c,所有的操作都得自己函数实现,而且时间还不优,自己写的代码难免漏洞百出...没办法,我Debug.......世界上最痛苦的事莫过于此......找了我n个小时,终于把我的c修复OK,最雷人的是,最后我还多输出一个空行,整了好几个“Presentation Error”...

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值