p3422最小費最大流(未解決)

2021-07-31 16:59:24 字數 1127 閱讀 6408

我真的好煩這個addedge啊,每次看到這個就暈

沒怎麼看懂,不想看

題意:對於n*n的陣列,給乙個k,從(1,1)走到(n,n),走k次,走到每個點權值加上當前這個點的權值,之後這個點權值為0,求最大權值

對點進行拆分建圖,乙個點拆為兩個點a和b,在a和b之間建一條花費為輸入值容量為1的邊,然後再建一條花費為0容量為k-1的邊,對b點對於其右邊和下邊都建立一條容量為k花費為0的邊,加入超級源點和匯點,花費為0容量為k,由此套模板就可以了

#include

#include

#include

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

using namespace std;

const int nmax = 5005;

const int emax = 20050;

struct

edge[emax];

int n, ans;

int k, edgehead[nmax];

int que[nmax], pre[nmax], dis[nmax];

bool vis[nmax];

void addedge(int u, int v, int ca, int co)

bool spfa()

dis[0] = 0;

que[0] = 0;

vis[0] = true;

while(head != tail)}}

vis[u] = false;

head ++;

if(head == nmax) head = 0;

}if(dis[n] <= 0) return false;

return true;

}void end()

}int main()

n = 2*n*n + 1;

addedge(0, 1, k, 0);

// 連源點的邊。

addedge(2*n*n, n, k, 0);

// 連匯點的邊。

ans = 0;

while(spfa()) 

end();

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

return 0;}

poj3422 最小費用最大流

記得以前做過這樣類似的題,因為那時候求的是來回的最大值,直接使用的dp,而且對費用流並不是很清楚,然後又看到了這道題。對點進行拆分建圖,乙個點拆為兩個點a和b,在a和b之間建一條花費為輸入值容量為1的邊,然後再建一條花費為0容量為k 1的邊,對b點對於其右邊和下邊都建立一條容量為k花費為0的邊,加入...

POJ 3422 最大流最小費用

題目大意 給定一張網格圖,需要從 1,1 走到 n,n 走k條路,每次走到乙個格仔上會把它的值變為0並且加到sum上去,問sum的最大值是多少 題目解析 構圖考慮到走一次費用就變成了0,所以乙個點要拆成2的點兩個點之間有一條邊容量為1,另一條容量為k 1,費用為0 因為是最大費用,只要把所有的值變成...

poj 3422 最小費用最大流

思路 求從起點到終點走k次獲得的最大值,最小費用最大流的應用 將點權轉化為邊權,需要拆點,邊容量為1,費用為該點的點權,表示該點的權值只能獲取一次,另外,應該連一條容量為inf,費用為0的邊,因為每條邊都可以走多次。另外就是增加源點和匯點了,源點與起點連容量為k,費用為0的邊,表示可以走k次,同理終...