codevs 1227 方格取數2

2021-07-09 20:46:50 字數 1169 閱讀 6660

網路流+拆點 π_π(好像hdu上有類似的題。。那時我還是用pascal寫的)

算是裸題吧。。然而我本不會費用流

看了下黃學長的**,說下自己的理解(黃學長只貼了**π_π)

把每乙個點拆成兩個點,乙個是流進的,乙個是流出的

然後建邊。。這兩個點之間有這幾類邊:由流入點指向流出點,流量為1,費用為map[i,j]

由流出點指向流入點,流量為0,費用為-map[i,j](即前一條的反向弧)

由流入點指向流出點,流量為k(即取數的次數,也就是最大流量),費用為0

(因為共取k次,可能不止一次經過這個點)

由流出點指向流入點,流量為0,費用為0(即前一條的反向弧)

蒟蒻表示算不清有多少條邊,所以瞥了一眼黃學長的陣列範圍。。。

然後spfa找最長路,即最大費用。當然也可以建邊的時候將費用取相反數,然後用最短路。。。(我感覺這完全是eggpain)

有通路就一直找,找到一條最長路就把答案加上這條路的最大流量乘每條邊的費用,直到沒有通路為止

一開始wa了,查來查去發現spfa的佇列開小了。。。

貼**吧:

#include#include#include#include#include#define maxe 1000010

#define maxn 6010

#define ll long long

#define inf 0x3f3f3f3f

using namespace std;

struct reed[maxe];

int e,n,k;

ll ans;

int head[maxn],dui[maxe],dis[maxn],from[maxn];

bool pd[maxn];

inline void ins(int x,int y,int fl,int c)

void init(){

scanf("%d%d",&n,&k);

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

for(int j=1;j<=n;++j){

int x;

scanf("%d",&x);

ins(n*(i-1)+j,n*(i-1)+j+n*n,1,x);

ins(n*(i-1)+j,n*(i-1)+j+n*n,k,0);

if(i0&&dis[v]伏地膜黃學長。。

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

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