HDU4738 Caocao's Bridges

题意

给出一个图,和一堆边,不保证没有重边,每一个边上携带者一个权值,现在问你能不能删去一条边,使图不再联通。可以的话删去权值最小的那条边,并且输出这个权值。

注意(坑点)

因为题意的特殊性,如果图本来就不联通,输出0.如果可以满足条件但最小的权值恰好是0,要输出1。

思路

删一个边把图裂开这种要求很明显就是找图的割边了。寻找割边是很典型的问题,应该使用tarjan算法,但是一定要注意重边对于找割边的影响(因为割边删掉后,图应该会裂开,但是如果有重边,删掉一条,还有一条,图显然不会裂开),因此我们要对原来的方法稍作修改,首先是存图的方式,我们不能漏掉任意一条边,因此一个理想的方式就是链式前向星。链式前向星有一个很好用的特性,我们在创建无向边的时候实际上是创建了两条有向边,而这两条有向边在链式前向星的容器中的编号是相邻的,也就是说对于编号i的边i^1就是这条边对应的反向边,这样我们就可以非常方便地标记这条边是不是已经走过(vis_e[i] = vis_e[i^1] = true)。tarjan部分附带了注释。

代码

 

Leave a Reply

Scroll to top