一周总结
一周总结
费用流:
BZOJ 1927 有n个点保证每个点都走一次,且走完n个点的 最 小花费。分点,保证每个点只走一次。
BZOJ2324 有n个点k个人保证在走完前i-1个点时,才能走第i个点,求遍历n个点的最小花费。此题建边时要用floyd求出前j个点时两点之间的最小距离d[j][i][j],建边时注意在保证从0点出去k个人的同时,还要在源点和其他的点连容量为1费用为0的边,以保证当点的个数大于人的个数的时候能遍历完所有的点。
单调队列:
HDU 2430 话说有n袋豆子,每袋豆子有一个重量wi,求一段连续编号豆子的重量sum%p<=K&&max(sum/p);
由于数据量较大,用单调队列,先求出前i袋豆子sum[i]%p,并记录位置,由于满足以下条件:
前提:i<=j
1.当sum[i]%p<=sum[j]%p 只需找到j前面的i使得上述条件满足即可
2.当sum[i]%p>sum[j]%p 当sum[j]%p<=k时无需再找i,因为本身就满足,否则我们可以得两者余数在[k+1,p-1]区间中,则(sum[j]%p-sum[i]%p+p)%p>=k+2.此时也不用找,
3.综上,我们可以用把sum[i]%p排序,用单调队列解决
其他单调队列,解法类似
二分匹配:
匈牙利算法就不说了。
重点还是KM算法,KM算法求最优匹配,思想就是对二部图中的x部和y部的节点进行赋权lx[maxn],ly[maxn]然后再来一个松弛度数组
Slack[maxn],当一个点扩展路径不成功时,松弛数组改变,改变的原则是每次求出不在交叉树中的最小slack,然后对被访问的ly,lx进行更新,找扩展路径是,是当两点权值之和等于边权时找,否则修改
Slack。
题目:hdu 租房分配
2-sat问题
这个问题其实就是&,|,xor,or问题,根据条件建边,求强连通,找矛盾
在2-sat中最重要的还是在不矛盾时找出匹配,即在每个强连通中去找标记可行的点,并标记已经找过,在求出的多个强连通中找,直到找全。
题目:参加宴会问题,婚姻匹配问题
割点问题:
也是连通题,当dfn[]<=low[]时,dfn所代表的点是割点,并记录是几个联通分量的割点。Hdu 4005 POJ 2117等
概率题
看了一些做的有点少,都是简单的
AC自动机
原理:就是trie树和fail指针的建立,query时只需要找fail指针指向的点next的count就行了
重点fail指针的建立和使用。