傳送門
最大費用最大流問題,也是乙個比較經典的模型。
拆點 可以看做是入點和出點,容量為1,費用為每乙個點的食物總量,以保證所有的點都只經過一次。
分別多建乙個起點和終點,起點分別向第一行的點連一條邊,容量為inf,費用為0,最後一行的點分別向終點連邊,容量為inf,費用為0,只是表示可以流過。
從超級源向起點連一條邊,容量為蚯蚓的數量,費用為0,從終點向超級匯連一條邊,容量為蚯蚓的數量,費用為0;不難看出這是限制了蚯蚓的數量<=k。
用最大費用最大流求解即可。
#include
#include
#include
#include
using
namespace
std;
const
int max_n=50;
const
int max_m=50;
const
int max_n=(max_n+2*max_m-1)*max_n+4;
const
int max_m=max_n*max_m*4;
const
int max_e=max_m*2;
const
int inf=1e9;
int n,m,k,food,x1,x2,y1,y2,cnt,maxflow,maxcost,n;
int next[max_e],point[max_n],v[max_e],remain[max_e],c[max_e],tot;
int last[max_n],dis[max_n],vis[max_n];
queue
q;inline
void addedge(int x,int y,int cap,int z)
inline
int addflow(int s,int t)
now=t;
while (now!=s)
return ans;
}inline
bool bfs(int s,int t)}}
if (dis[t]<0) return
false;
int flow=addflow(s,t);
maxflow+=flow;
maxcost+=flow*dis[t];
return
true;
}inline
void major(int s,int t)
int main()
else
addedge(x2,n-1,inf,0);
}addedge(1,2,k,0);
addedge(n-1,n,k,0);
major(1,n);
printf("%d\n",maxcost);
}
①最大費用最大流和最小費用最大流的區別在於:dis陣列初始值為負無窮,dis[s]=0;判斷條件的大於小於號方向相反;退出的條件不同。
②算好點數和邊數,避免陣列爆掉。
③建圖時一系列的編號想清楚。
codevs1033 蚯蚓的遊戲問題
題目描述 description a 1,1 a 1,2 a 1,m a 2,1 a 2,2 a 2,3 a 2,m a 2,m 1 a 3,1 a 3,2 a 3,3 a 3,m 1 a 3,m 2 a n,1 a n,2 a n,3 a n,m n 1 它們把食物分成n行,第1行有m堆的食物,每...
codevs 1033蚯蚓的遊戲 (最大費用流
題目描述 description 在一塊梯形田地上,一群蚯蚓在做收集食物遊戲。蚯蚓們把梯形田地上的食物堆積整理如下 a 1,1 a 1,2 a 1,m a 2,1 a 2,2 a 2,3 a 2,m a 2,m 1 a 3,1 a 3,2 a 3,3 a 3,m 1 a 3,m 2 a n,1 a ...
1033 蚯蚓的遊戲問題
題目描述 description a 1,1 a 1,2 a 1,m a 2,1 a 2,2 a 2,3 a 2,m a 2,m 1 a 3,1 a 3,2 a 3,3 a 3,m 1 a 3,m 2 a n,1 a n,2 a n,3 a n,m n 1 它們把食物分成n行,第1行有m堆的食物,每...