洛谷P2045 方格取數加強版

2021-08-10 19:43:51 字數 1120 閱讀 3758

傳送門

一看題意,發現第二次取就是0了,那麼就想到了網路流(其實是看標籤)

費用流建圖:

1.首先s向(1,1)連一條費用為0,容量k的邊

2.然後(n,n)向t連一條費用為0,容量k的邊

3.每個點(i,j)向(i+1,j)和(i,j+1)連一條費用0,容量k的邊(此處注意判邊界)

4.每個點拆成入點和出點,然後入點向出點連一條容量1,費用ai

,j的邊

5.然後再入點向出點連一條容量k-1,費用0的邊

然後跑最大費用最大流就好了。

(小技巧:其實我們可以將所有費用全部取相反數,然後跑完之後再把答案取相反數就好了)

**:

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

const

int n=5e3+10,m=n*30;

int n,k,s,t,tot=-1,all;

int head[n],mark[n],d[n],q[m],cur[n],inq[n],to[m],flow[m],next[m],cost[m];

inline

void addedge(int x,int y,int l,int c)

inline

bool spfa()}}

inq[x]=0;

}return d[t]!=0x3f3f3f3f;

}int c;

inline

int dfs(int x,int a)

}return f;

}inline

void mcmf()

}}int main()

}addedge(s,1,k,0);

addedge(all+all,t,k,0);

mcmf();

printf("%d",-c);

return

0;}

洛谷P2045 方格取數加強版

題目 link 網路流 費用流 一道比較好建模的題,重點是怎樣讓每個數隻被取一次 控制每個點被走的次數,我們可以很容易想到拆點 對於每個點,我們在入點和出點之間連兩條邊,一條流量為 1 11,費用為該格仔的權值 另一條流量為 infty 費用為 0 00。除此之外,每個點還要分別向右邊和下面的連邊,...

P2045 方格取數加強版

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

P2045 方格取數加強版

簡單的拆點 拆成入點和出點,對應點之間連一條cap 1,cost x和一條cap inf,cost 0的邊,然後相鄰點的出點和其他點的入點連邊,然後s有k的流量,然後跑最大費用最大流就好了 include include include include include using namespace...