网络流24题

题目列表:
<最大流有FF、EK、Dinic算法,最小费用流有SPFA、DIjkstra求解算法等,网络流在于建模,在此不在贴出代码>

P2756 飞行员配对方案问题

  • 二分图最大匹配(匈牙利算法),看着模板一顿乱敲即可。

P4016 负载平衡问题

  • 最小费用流
  • 建模:源点s=0,汇点t=n+1,平均值ave(对于样例为12)
    1. 源点s向节点i(i的值s[i]>平均值ave)连边,花费0,容量s[i]-ave。
    2. 节点i(i的值s[i]>平均值ave)向节点j(j的值s[j]<平均值ave)连边,花费为节点i和j的顺逆中的最短距离,容量s[i]-ave。
    3. 节点j(j的值s[j]<平均值ave)向汇点连边,花费0,容量ave-s[j]。

P1251 餐巾计划问题

  • 最小费用流
  • 建模:源点s,汇点t,第i天为节点i。add_edge(from,to,cost,cap)。
    1. 对于节点i,每天都可以直接购买今天所需的餐巾数,连边:add_edge(s,i,p,num[i]) 。每天都需要num[i]数量的餐巾数,即保证每天向汇点t流入num[i]流量,连边:add_edge(i,t,0,num[i])。
    2. 节点i的餐巾可以经过快洗/慢洗送给节点i+m/i+n使用。这就表明了:
      ①从节点i流向节点i+m/i+n的容量必为num[i]。
      ②由于从源点s流向节点i的容量为num[i],而节点i流向节点i+m/i+n容量为num[i],流向汇点t的容量也为num[i],不满足一定可以向节点i+m/i+n流容量num[i]。
      所以,对节点i进行拆点,拆为i和i+N,拆点之后直接从汇点s向i+N连边,不经过节点i。
    3. 源点s=0,汇点t=2*N+1。
      源点s向节点i+n连边,容量为num[i],即:add_edge(s,i+N,0,num[i]),保证了条件2。
      同时节点i的餐巾可以经过快洗/慢洗送给节点i+m/i+n使用,分别连边:add_edge(i+N,i+m,f,inf);add_edge(i+N,i+n,s,inf)。
    4. 节点i的餐巾只需送给第i+m/i+n个节点就好,然后分别在节点之间连边,add_edge(i,i+1,0,inf);表明今天剩余的餐巾可以留到下一天用。
// 建模代码:
int st=0,ed=2*N+1;
for(int i=1;i<=N;i++){
	add_edge(st,i,p,num[i]);
	add_edge(i,ed,0,num[i]);
	add_edge(st,N+i,0,num[i]);
	if(i+1<=N)add_edge(i,i+1,0,inf);
	if(i+m<=N)add_edge(N+i,i+m,f,inf);
	if(i+n<=N)add_edge(N+i,i+n,s,inf); 
}
printf("%lld\n",min_cost_flow(st,ed));

P2761 软件补丁问题

  • 最短路(说好的网络流24题呐!),状态用二进制压缩一下。
    对于样例n=3,起点状态:111 终点为:000
    对于状态u可以依次判断是否和1~m个补丁相容,进而进行状态转移。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章