LGP2045 方格取數加強版

2022-03-27 02:51:21 字數 1131 閱讀 9424

題目

還糾結了一下是費用流還是最小割

最終還是決定讓最小割去死吧

我們的問題就是讓乙個點的點權只被計算一次

考慮拆點

將所有點拆成入點和出點,入點向出點連流量為\(1\)的邊

每乙個出點往下連能到達的點,向入點連費用為該點點權容量為\(0\)的邊,向出點連費用為\(0\)容量為\(k-1\)的邊

這樣我們就能保證乙個點的點權只被計算一次了

**

#include#include#include#include#include#define re register

#define ll long long

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

const int maxn=5005;

const int inf=99999999;

inline int read()

struct ee[maxn*100];

const int dx=;

const int dy=;

std::queueq;

int n,num=1,s,t,m,a[51][51],out[51][51],in[51][51];

int head[maxn],vis[maxn],d[maxn];

inline void c(int x,int y,int w,int f)

inline void add(int x,int y,int w,int f)

inline int spfa()

} return d[s]n||y>n) continue;

add(out[i][j],in[x][y],a[x][y],1);

add(out[i][j],out[x][y],0,inf);

}int ans=0;

add(s,in[1][1],a[1][1],1);add(s,out[1][1],0,m-1);

add(out[n][n],t,0,m);

while(spfa())

} printf("%d\n",ans);

return 0;

}

luogu P2045 方格取數加強版

題目傳送門 題意 有乙個n n的矩陣,每乙個點都有對應的權值,現在你可以走k次,求你能獲得的最大價值。注意 每個點選完之後權值變為0。思路 最大費用最大流啊。1.因為只能選k次,所以開乙個超級源點和超級匯點,分別連向 1,1 和 n,n 流量為k。2.因為每個點的權值只能選一次,所以拆點。1 每乙個...

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...