网络流习题

来源:互联网 发布:好的淘宝零食点知乎 编辑:程序博客网 时间:2024/05/16 16:08
1.(飞行员配对问题)每架飞机需要2个飞行员,一个英国,一个外籍,现在告诉你每个外籍飞行员可以和哪些英国飞行员配合,求最多能配对多少对 
二分图最大匹配
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子序列全部建了出来 那我们要求的就是 删掉最少的边 让这个网络流中断 相当于每一条连向汇点的边都会在路径上被破坏 这就是求这个图的 最小割
而又有 最大流最小割定理:网络流中,能够从源点到达汇点的最大流量==如果从网络中移除就能够导致网络流中断的边的集合的最小容量和
所以再跑一次最大流即为答案

0 0
原创粉丝点击