Codevs 1227 方格取數 2 費用流

2021-07-27 05:41:33 字數 1513 閱讀 4025

1227 方格取數 2

時間限制: 1 s

空間限制: 128000 kb

題目等級 :大師 master

檢視執行結果

題目描述 description

給出乙個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 1

1 2 3

0 2 1

1 4 2

樣例輸出 sample output

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

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

分類標籤 tags

網路流 費用流 圖論

/*

拆點+費用流.

自己yy不對然後看的題解orz.

考慮兩個東西.

一是計算答案貢獻並保證貢獻只計算一次.

二是使圖連通.

通過一我們很容易想到拆點後建一條流量為1費用為格仔貢獻的邊.

通過二拆點後建一條流量為k-1費用為0的邊.

然後把(i,j)與(i-1,j)和(i,j-1)連線起來.

*/#include

#include

#include

#define maxn 10010

#define inf 1e9

using namespace std;

int n,k,ans,cut=1,tot,s,t,head[maxn],g[51][51],dis[maxn],b[maxn],fa[maxn];

struct datae[maxn*2];

queueq;

intread()

while(ch>='0'&&ch<='9') x=x

*10+ch-48,ch=getchar();

return

x*f;

}void add(int u,int v,int c,int f)

bool bfs(int t)}}

return dis[t]!=-inf;

}void mincost()

ans+=dis[t]*x;

}return ;

}int main()

mincost();

printf("%d",ans);

return

0;}

codevs 1227 方格取數2

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

code vs 1227 方格取數 2

時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解 檢視執行結果 給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要...

codevs1227 方格取數 2

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