Codevs 1227 方格取數2 費用流

2021-08-13 20:32:15 字數 1303 閱讀 1529

題目大意:傳k遍紙條

每個點拆成入和出,入向出連一條容量為1,費用為該點權值的邊(表示選這個點,只能走一次)

再連一條容量為inf,費用0的邊(選過就不再有貢獻)

每個點的出向右和下的入連一條容量為inf費用為0的邊

超級源連點(1,1)的入一條容量為k,費用0的邊(傳k遍),點(n,m)的出連向超級匯,容量inf,費用0

跑最大費用流

**如下:

#include

#include

#include

#include

#define n 50020

#define inf 2147483647

using

namespace

std;

const

int s=50001;

const

int t=50002;

inline

int read()

queue

q;int n,k,x,cost,top=1;

int d[n],fir[n];

bool b[n];

struct edge

}nex[250005];

inline

int getnum(int x,int y)

inline

bool spfa()

}return d[t]!=-inf;

}int dfs(int x,int v)

b[x]=true;

int tmp=0;

for(int i=fir[x];i;i=nex[i].nex)

if(!b[nex[i].to] && d[nex[i].to]==d[x]+nex[i].v && nex[i].k)

if(!tmp) d[x]=-inf;

return tmp;

}inline

void dinic()

inline

void add(int x,int y,int k,int v)

int main()

if(j+1

<=n)

}add(s,getnum(1,1),k,0);add(getnum(1,1),s,0,0);

add(getnum(n,n)+n*n,t,inf,0);add(t,getnum(n,n)+n*n,0,0);

dinic();

printf("%d",cost);

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