Zoj 3509

来源:互联网 发布:网络交易平台可信吗 编辑:程序博客网 时间:2024/05/22 05:09

       这是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”...

 

原创粉丝点击