POJ3422簡單費用流

2021-06-27 12:01:27 字數 1112 閱讀 7858

題意:

給乙個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的邊,加入...