P2045 方格取數加強版

2022-05-01 21:12:15 字數 1093 閱讀 4053

簡單的拆點

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

#include #include #include #include #include using namespace std;

struct edge;

const int maxn = 10000;

const int inf = 0x3f3f3f3f;

vectoredges;

vectorg[maxn];

void addedge(int u,int v,int cap,int cost));

edges.push_back((edge));

int cnt=edges.size();

g[u].push_back(cnt-2);

g[v].push_back(cnt-1);

}int d[maxn],a[maxn],p[maxn],vis[maxn],s,t;

queueq;

bool spfa(int &flow,int &cost)}}

}if(d[t]==inf)

return false;

flow+=a[t];

cost+=d[t]*a[t];

for(int i=t;i!=s;i=edges[p[i]].u)

return true;

}void mcmf(int &flow,int &cost)

int n,k;

inline int id(int x,int y)

int main()

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

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

addedge(id(n,n)+n*n,t,inf,0);

int cost,flow;

mcmf(flow,cost);

printf("%d\n",-cost);

return 0;

}

P2045 方格取數加強版

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

洛谷P2045 方格取數加強版

傳送門 一看題意,發現第二次取就是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.每個點拆成入點和...

洛谷P2045 方格取數加強版

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