1227 方格取數 2

2022-05-03 10:18:23 字數 1318 閱讀 9791

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

輸入格式:

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

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

輸出格式:

乙個數,為最大和

輸入樣例#1:

3 1

1 2 3

0 2 1

1 4 2

輸出樣例#1:

11

每個格仔中的數不超過100

【題解】

先把每個點拆成2個a,b,

ai->bi之間連2條邊,一條流量為1,費用為該格點上的權值,以計算費用,

另一條流量為inf,費用為0,保證通路,再把每個點掃一遍,

可以到達的點之間bi->aj連流量inf,費用0的邊。

虛擬源st=0,st->a1(第乙個點)連費用0,流量k的邊,限制流量。

虛擬匯ed=n*n*2+1,,右下角的格點bi->ed連費用0,流量k的邊。。。

跑一遍最大費用最大流就行了。。

#include#include

using

namespace

std;

const

int n=110

;const

int m=n*n;

const

int inf=0x3f3f3f3f

;struct

nodee[m*50];int tot=1

;int n,m,k,s,t,ans,head[m],dis[m],pree[m],q[m*50

];bool

vis[m];

void add(int x,int y,int cap,int

cost)

bool

spfa()}}

}return dis[t]>0;}

void

augment()

for(int i=t;i!=s;i=e[pree[i]^1

].v)

}int

main()

}add(s,s+1,k,0

); add(t-1,t,k,0

);

while

(spfa()) augment();

printf("%d

",ans);

return0;

}

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。這就表示乙...