wikioi 1227 方格取數 2(費用流)

2022-05-12 02:23:09 字數 1817 閱讀 5017

裸題,拆點,容量為1,費用為點權的負數(代表只能取一次)。再在拆好的兩個點連邊,容量為oo,費用為0。(代表能取0)

然後向右和下連邊,容量我oo,費用為0

最後跑一次最小費用,取絕對值就是答案。

#include #include #include #include #include #include using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define cc(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << #x << " = " << x << endl

#define printarr(a, n, m) rep(aaa, n)

inline const int getint()

inline const int max(const int &a, const int &b)

inline const int min(const int &a, const int &b) e[m];

inline void add(const int &u, const int &v, const int &c, const int &w)

inline const bool spfa(const int &s, const int &t)

} vis[u]=0;

} return d[t]!=1000000000;

}int mcf(const int &s, const int &t)

return ret;

}int main() {

read(n); read(k);

int s=0, t=n*n*2+1, c, now, pw=n*n;

for1(i, 1, n) for1(j, 1, n) {

read(c); now=(i-1)*n+j;

add(now, now+pw, 1, -c); add(now, now+pw, oo, 0);

if(i

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

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

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

乙個數,為最大和

3 1

1 2 3

0 2 1

1 4 2

11

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

1227 方格取數 2

給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求k次所達到的方格的數的和最大 輸入格式 第一行兩個數n,k 1 n 50,0 k 10 接下來n...

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次,現在要...