P2405 方格取數問題加強版 費用流

2022-02-28 16:50:22 字數 1285 閱讀 7577

考慮如何建圖。還是老樣子先拆點,然後把每兩個點之間連線兩條邊,一條流量為1,費用為-點權,處理是否走這個點。一條流量無限,沒有費用,因為哪怕乙個點選過了,它的地方還是可以重複走過去的。 然後把經由乙個點能到達的另乙個點連邊。因為要走k次,所以由s向1號點入點連邊,n號點出點向t連邊,流量為k,費用為0。然後一邊最小費用最大流板子即可。 然後發現這些個題解裡沒有用原始對偶來實現的,所以弱弱的拿出自己**,勉強還是能在最優解第一頁裡的,膜拜那些50ms都不到就跑完的dalao們。

#include#include

#include

#include

#include

#include

#define ll long long

#define rp (i-1)*n+j

#define cp (i-1)*n+j+n*n

#define inf 50000000

#define re register

using

namespace

std;

struct

poedge[

250001

];int head[250001],cur[1000001],dep[60001],n,m,s,t,u,num=-1

,x,y,l,tot,sum,k;

int dis[6001],b[6001],xb[20001],flow[20001],a[55][55

];inline

intread()

inline

void add_edge(int

from,int to,int w,int

dis)

inline

void add(int

from,int to,int w,int

dis)

inline

bool

spfa()}}

}return dis[s]}inline

int dfs(int u,int

low)

int diss=0

; b[u]=1

;

for(re int i=head[u];i!=-1;i=edge[i].nxt)}}

return

diss;

}inline

void

max_flow()

}}int

main()

max_flow();

cout

<<-tot;

}

LG2045 方格取數加強版 費用流

lg2045 費用流。套路拆點,把 i,j 拆為兩個點,在這兩個點之間連邊 一條邊流量為 1 費用為 a 另一條邊為流量為 inf 費用為 0 表示聯通 然後在 i,j 的出點向 i 1,j i,j 1 連邊,流量 inf 費用 0 表示聯通。建立 s,t 分別於 1,1 n,n 相連,流量為 k ...

洛谷P2045 方格取數加強版 費用流

題目鏈結 這題能想到費用流就不難做了 從s向 1,1 連費用為0,流量為k的邊 從 n,n 向t連費用為0,流量為k的邊 對於每個點我們可以拆點限流,同時為了保證每個點只被經過一次,需要拆點。對於拆出來的每個點,在其中連兩條邊,一條為費用為點權,流量為1,另一條費用為0,流量為inf 相鄰兩個點之間...

P2045 方格取數加強版

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