考慮如何建圖。還是老樣子先拆點,然後把每兩個點之間連線兩條邊,一條流量為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...