codevs 1033蚯蚓的遊戲 (最大費用流

2021-07-07 04:43:39 字數 2692 閱讀 2378

題目描述 

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堆的食物,每堆的食物量分別是a(1,1),a(1,2),…,a(1,m);

第2行有m+1堆食物,每堆的食物量分別是a(2,1),a(2,2),…, a(2,m+1);以下依次有m+2堆、m+3堆、…m+n-1堆食物。

現在蚯蚓們選擇了k條蚯蚓來測試它們的合作能力(1≤ k≤m)。測試法如下:第1條蚯蚓從第1行選擇一堆食物,然後往左下或右下爬,並收集1堆食物,例如從a(1,2)只能爬向a(2,2)或a(2,3),而不能爬向其它地方。接下來再爬向下一行收集一堆食物,直到第n行收集一堆食物。第1條蚯蚓所收集到的食物量是它在每一行所收集的食物量之和;第2條蚯蚓也從第1行爬到第n行,每行收集一堆食物,爬的方法與第1條蚯蚓相類似,但不能碰到第1條蚯蚓所爬的軌跡;一般地,第i條蚯蚓從第1行爬到第 n行,每行收集一堆食物,爬的方法與第1條蚯蚓類似,但不能碰到前 i-1條蚯蚓所爬的軌跡。這k條蚯蚓應該如何合作,才能使它們所收集到的食物總量最多?收集到的食物總量可代表這k條蚯蚓的合作水平。

給定上述梯形m、n和k的值(1≤k≤m≤30;1≤n≤30)以及梯形中每堆食物的量(小於10的非整數),程式設計計算這k條蚯蚓所能收集到的食物的最多總量。

輸入描述 

inputdescription

輸入資料由檔名為input1.*的文字檔案提供,共有n+1行。每行的兩個資料之間用乙個空格隔開。

●第1行是n、m和k的值。

輸出描述 

outputdescription

程式執行結束時,在螢幕上輸出k蚯蚓條所能收集到的食物的最多總量。

樣例輸入 

sampleinput

3 2 2 

1 25 

0  2

1  10 0  6

樣例輸出 

sampleoutput

26

其實這一題和我之前寫的方格取數2差不多= =

用spfa跑一邊最大費用流。

分析:怎麼說膩=。= 

你要會做這道題你得知道什麼是網路流,這裡需要將起點自己模擬出來,設為s,再將s拆成兩個點(s——》s'),中間用一條最大流量為k的邊連起來。再去將第一行的所有點與這個s'連起來,最大流量均為 1(因為只能跑一次)。由於只有點有值,邊是沒有價值的,所以那些並非拆點產生的邊的花費均為0,而拆點產生的邊連線兩個點的價值即為原來那個點的價值。 

由於原圖中不可能存在環,所以用求最短路徑的spfa去跑最大費用流是不會有問題的。

**:#include

#include

#include

#include

#include

using namespace std;

int now=1,start=1,end,n,m;

intnext[100001],head[100001],other[100001],flow[100001],cost[100001],cap[100001];

struct point ;

point pointnumber[100][100];

inline point point_number(int x,int y)

inline void point_add(int x,int y)

else

add_side(point_number(x-1,y).out,point_number(x,y).in,0,1,0),

add_side(point_number(x,y).in,point_number(x-1,y).out,0,0,0); 

else

add_side(0,point_number(x,y).in,0,1,0),

add_side(point_number(x,y).in,0,0,0,0);

if(x==n)

add_side(point_number(x,y).out,end,0,1,0),

add_side(end,point_number(x,y).out,0,0,0);

} void read()

int res;

int line[100001],pre[100001],dis[100001];

bool visited[100001];

inline bool spfa()

j=next[j]; }

if(line[left]!=1)visited[line[left]]=false;

l++; }

res=dis[end];

if(res==0)

returnfalse;

int i=end;

do

flow[j]+=1;

flow[j^1]-=1; 

i=pre[i];

}while(i!=1);

return res!=0; }

int main()

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堆的食物,每...

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

傳送門 最大費用最大流問題,也是乙個比較經典的模型。拆點 可以看做是入點和出點,容量為1,費用為每乙個點的食物總量,以保證所有的點都只經過一次。分別多建乙個起點和終點,起點分別向第一行的點連一條邊,容量為inf,費用為0,最後一行的點分別向終點連邊,容量為inf,費用為0,只是表示可以流過。從超級源...

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堆的食物,每...