我真的好煩這個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次,同理終...