1033 蚯蚓的遊戲問題

2022-07-29 03:06:16 字數 2994 閱讀 3786

題目描述 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條蚯蚓所能收集到的食物的最多總量。

輸入描述 input description

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

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

輸出描述 output description

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

樣例輸入 sample input

3    2   2    

1   2

5   0   2

1   10  0  6

樣例輸出 sample output

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;typedef unsigned

long

long

ull;

/*每個點只過一次 拆點建邊(容量為1,費用為權值)

k條蚯蚓,從源點流出容量為k

源點向入點加邊(容量為1,費用為0)

出點向匯點加邊(容量為1,費用為0)

*/const

int maxn = 10000

;const

int maxm = 100000

;const

int inf = 0x3f3f3f3f

;struct

edge

edge[maxm];

inthead[maxn], tol;

intpre[maxn], dis[maxn];

bool

vis[maxn];

int n;//

節點總個數,節點編號從0~n-1

void init(int

n)void addedge(int u, int v, int cap, int

cost)

bool spfa(int s, int

t) dis[s] = 0

; vis[s] = true

; q.push(s);

while (!q.empty())}}

}if (pre[t] == -1)return

false

;

else

return

true;}

//返回的是最大流,cost存的是最小費用

int mincostmaxflow(int s, int t, int &cost)

for (int i = pre[t]; i != -1; i = pre[edge[i ^ 1

].to])

flow +=min;

}return

flow;

}int

m, n, k;

intval[maxn];

int next[maxn][2

];int

main()

cin >> val[cnt++];}}

int num = cnt - 1

; init(

2 * num + 3

);

for (int i = 1; i <= cnt; i++)

for (int i = 1; i <= m; i++)

for (int i = num, tmp = 1; tmp < m + n; i--, tmp++)

for (int i = 1; i <= cnt; i++)

addedge(

2 * num + 2, 0, k, 0

);

intans;

mincostmaxflow(

2 * num + 2, 2 * num + 1

, ans);

cout

<< -ans

}

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,只是表示可以流過。從超級源...

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 ...