題意:
給乙個n*n的矩陣,從左上角走到右下角,的最大收益,可以走k次,每個格仔的價值只能取一次,但是可以走多次。
思路:比較簡單的乙個費用流題目,直接拆點,拆開的點之間連線兩條邊,一條是流量1費用是這個點的價值,另一條是流量k-1費用是0,然後就是當前這個點連線右下方的點,然後在虛擬出超級遠點和匯點限流用的,比較簡單,不解釋了。
#include
#include
#include
#include
#define n_node 5100
#define n_edge 200000
#define inf 1000000000
using namespace std;
typedef struct
star;
star e[n_edge];
int list[n_node] ,tot;
int s_x[n_node] ,mer[n_node];
void add(int a ,int b ,int c ,int d)
bool spfa(int s ,int t ,int n)
;queueq;
q.push(s);
s_x[s] = 0;
mark[s] = 1;
memset(mer ,255 ,sizeof(mer));
while(!q.empty())}}
}return mer[t] != -1;
}int m_m_flow(int s ,int t ,int n)
maxflow += minflow;
}return maxcost;
}int main ()
add(0 ,1 ,0 ,k);
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
add(n * n * 2 ,n * n * 2 + 1 ,0 ,k);
ans = m_m_flow(0 ,n * n * 2 + 1 ,n * n * 2 + 1);
printf("%d\n" ,ans);
}return 0;
}
poj 3422 最小費用流
如果不是從費用流區做這個題幾乎不會想到用費用流 點有權值很容易想到拆點 問題是求最大sum 把權值取負 這樣最小費用流的相反數就是最大sum 源點s匯點t k為移動次數 矩陣中的點拆成入點出點 入點到出點連 乙個1容量,1 點權費用 乙個k容量,0費用 兩條邊。這樣能保證只在第一次經過點時獲得點的權...
POJ 3422 最大費用 cpp
題意 給出乙個每一格帶值的矩陣 每一次只可以從左上角走到右下角 問走過k次後最多能得到多少值 p.s 走過的格仔值會變成0 輸入 給出乙個n 和 k 給出n n 矩陣 思路 因為求的是最大值 所以應該求最長距離.把最小路徑改成求最大路徑 相應改變的就是鬆弛操作 和 dis的初始狀態 為了保證每個點只...
poj3422 最小費用最大流
記得以前做過這樣類似的題,因為那時候求的是來回的最大值,直接使用的dp,而且對費用流並不是很清楚,然後又看到了這道題。對點進行拆分建圖,乙個點拆為兩個點a和b,在a和b之間建一條花費為輸入值容量為1的邊,然後再建一條花費為0容量為k 1的邊,對b點對於其右邊和下邊都建立一條容量為k花費為0的邊,加入...