https://cn.vjudge.net/problem/SGU-206
这个题乍一看不可做系列(难道不是吗),像是跟生成树相关的问题。然而看了dalao的博客和论文之后总算搞明白了原来要转化为二分图模型。而之所以能转化就是因为里面的绝对值去掉不等式(去绝对值用的是贪心的思想,1-n-1之间的都要变小,n到m的都要变大)之后,非树边 j 和树边 i 的delta关系可以写成Di+Dj>=Ci-Cj,然后dalao们就想到了KM算法里的标杆与权值之间的不等式关系 鬼知道他们怎么想到的
KM算法的话,标杆是恒满足lx[i]+ly[j]>=w[i][j]的,而且跑完KM之后每一对都取到了等号,这时候可以证明Σlx[i]+Σly[i]取得最小值(参考王俊前辈集训队论文)而我们研究的问题是Di+Dj,那么其实可以把原图转换一个二分图出来,左边的节点代表树边(没错,一个点对应的是原图中的一条树边),右边的代表非树边,中间权值为Ci – Cj,其中C是原图中边的权值 。建好二分图之后跑一边KM即可。
所以现在关键的问题就在于怎么建二分图了。参考了dalao的做法,由于点和边的数量其实很少,所以直接非常暴力的dfs,从一条非树边的一个节点开始沿着树搜索,直到搜索到这条边的另一个节点才返回1,搜到其他的叶子都返回0(超级暴力有没有。。。)具体看代码。
#include
#include
#include
#include