二分图最大匹配
1匈牙利
2最大流 对于每个外籍i,向他可以配合j的英籍 build(i,j,1)
对于每个外籍i build(s,i,1) 对于每个英籍j build(j,t,1)
2.(SCOI2007修车)同一时刻有N位车主带着他们的爱车来到了汽车维修中心 维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的 现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间
费用流
N辆车,M个工人。
把每个工人拆成N个点 A[i][j]表示第i个工人修倒数第j辆车。
对于每辆车i build(s,i,1,0)
和所有n*m拆点build(i,A[j][k],1,time[i][j]*k)
对于所有的拆点 build(A[j][k],t,1,0);
由于求平均ans=最大流/n
考虑第i个工人,他修第j辆车只对后面要修的车有影响,而前面修过的车已经对当前没有影响了
而这个影响就是后面每个将要修理的车都多等待了time的时间
其他边流量都显然为1,每辆车修一次,每个工人一次只能修理一辆车
3.(scut128)给一个长度100的 正整数序列A 定义它的bx子序列是满足 前一个数是后一个数的一个因子
例如 1 2 6 48 96为 1 2 3 6 48 86 96的一个bx序列
对于A 假设 它的最长bx子序列长度为k 求 最少删掉几个数 使得 它的最长子序列长度小于k
T组数据 <=20
n <=100
n个数代表A <=10^9
2
4
1 3 2 6//ans=1
6
2 4 8 3 9 27//ans=2
第一组 bx有 1 3 6 和 1 2 6 删掉 1 或 6都可以满足
第二组 bx有 2 4 8 和 3 9 27 任意从两序列各删掉一个才能满足
sol:先dp求出最长的序列 f[i]表示以a[i]结尾的最长bx序列 f[i]=max(f[j]+1) (a[i]%a[j]==0 j<=i)找到k
对于每个点拆点成一进一出两个点
对于所有f[i]==1的点 build(s,i,1); 表示源点连向起点
对于所有f[i]==k的点 build(i+n,t,1); 表示终点连向汇点
对于所有的f[i]==f[j]+1 && a[i]%a[j]==0 && i>=j 的点 build(j+n,i,1) j的出边连向i的进边
这样建图相当于把所有的最长bx子序列全部建了出来 那我们要求的就是 删掉最少的边 让这个网络流中断 相当于每一条连向汇点的边都会在路径上被破坏 这就是求这个图的 最小割
而又有 最大流最小割定理:网络流中,能够从源点到达汇点的最大流量==如果从网络中移除就能够导致网络流中断的边的集合的最小容量和
所以再跑一次最大流即为答案