code vs 1227 方格取數 2

2021-07-10 09:27:09 字數 1332 閱讀 4921

時間限制: 1 s

空間限制: 128000 kb

題目等級 : 大師 master

題解

檢視執行結果

給出乙個n*n的矩陣,每一格有乙個非負整數aij,(aij <= 1000)現在從(1,1)出發,可以往右或者往下走,最後到達(n,n),每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大

輸入描述 input description

第一行兩個數n,k(1<=n<=50, 0<=k<=10)

接下來n行,每行n個數,分別表示矩陣的每個格仔的數

輸出描述 output description

乙個數,為最大和

樣例輸入 sample input

3 11 2 3

0 2 1

1 4 2

樣例輸出 sample output

11 資料範圍及提示 data size & hint

1<=n<=50, 0<=k<=10

題解:最大費用最大流

這道題重點在建圖,因為乙個點可以經過多次但是權值只能取一次,所以我們把乙個點拆成兩個,連兩條邊。

一條容量為1,權值為該點的權值

一條容量為inf,權值為0. 其餘的地方自己yy就可以了

#include#include#include#include#include#includeusing namespace std;

int n,k,maxn;

int next[20000],point[10000],cost[20000],remain[20000],v[20000],tot=-1;

int dis[10000],laste[10000],can[10000];

const int inf=1e9;

void add(int x,int y,int z,int q)

int addflow(int s,int t)

now=t;

while(now!=s)

return minn;

}bool spfa(int s,int t)

{ for (int i=s;i<=t;i++)

dis[i]=-inf;

memset(can,0,sizeof(can));

dis[s]=0; can[s]=1;

queuep; p.push(s);

while(!p.empty())

{int now=p.front(); p.pop();

for (int i=point[now];i!=-1;i=next[i])

if (dis[v[i]]

codevs 1227 方格取數2

網路流 拆點 好像hdu上有類似的題。那時我還是用pascal寫的 算是裸題吧。然而我本不會費用流 看了下黃學長的 說下自己的理解 黃學長只貼了 把每乙個點拆成兩個點,乙個是流進的,乙個是流出的 然後建邊。這兩個點之間有這幾類邊 由流入點指向流出點,流量為1,費用為map i,j 由流出點指向流入點...

codevs1227 方格取數 2

題目鏈結 n n的方格,每個格仔中有乙個數,尋找從 1,1 走到 n,n 的k條路徑,使得取到的數的和最大。經典的費用流應用吧。額外新增源點s和匯點t,分別與 1,1 和 n,n 連邊。把棋盤中每個點拆成兩個,連兩條弧。其中一條容量為1,費用為該點的數字大小 另一條容量為inf,費用為0。這就表示乙...

codevs1227 方格取數2,費用流

傳送門 寫在前面 努力提公升寫網路流的能力 思路 建圖和蚯蚓很相似,不過這裡 i,j 拆出的兩個點x,y之間的邊有花費,實際點 i,j 與 i 1,j i,j 與 i,j 1 之間的連邊要流量inf費用為0,而且拆出的兩個點都要向 i 1,j i,j 1 的x點連邊,因為可能我們之前已經去過 i,j...