傳送門
一看題意,發現第二次取就是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...