CODEVS1033 蚯蚓的遊戲問題(費用流)

2021-07-10 09:02:55 字數 1529 閱讀 6583

傳送門

最大費用最大流問題,也是乙個比較經典的模型。

拆點 可以看做是入點和出點,容量為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堆的食物,每...