POJ 3422 最大流最小費用

2021-07-25 08:29:55 字數 1294 閱讀 8376

題目大意:

給定一張網格圖,需要從(1,1)走到(n,n

)走k條路,每次走到乙個格仔上會把它的值變為0並且加到sum上去,問sum的最大值是多少;

題目解析:

構圖考慮到走一次費用就變成了0,所以乙個點要拆成2的點兩個點之間有一條邊容量為1,另一條容量為k-1,費用為0;因為是最大費用,只要把所有的值變成負的,最後去相反數即可;

ac**:

#include#include#include#include#include#include#include#includeusing namespace std;  

const int maxn = 60;

const int maxm = 100000;

const int inf = 0x3fffffff;

struct edge

edge[maxm];

int head[maxm],tol;

int pre[maxm],dis[maxm];

bool vis[maxm];

int start, end;

void init()

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

bool spfa(int s,int t)

dis[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty())

}

}

}

if(pre[t] == -1)

else

return true;

}

int mincostmaxflow(int s,int t,int &cost)

for(int i = pre[t]; i != -1; i = pre[edge[i^1].to])

flow += min;

}

return flow;

}

int n,k,graph[maxn][maxn];

int main()

} int ans;

int f=mincostmaxflow(0,2*n*n+1,ans);

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

} return 0;

}

poj3422 最小費用最大流

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

poj 3422 最小費用最大流

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

POJ 3422 最小費用最大流

關鍵是如何處理 只能獲取一次 的問題,為此可以為每個點建立偽點,由兩條有向邊相連。原始點到偽點連一條容量為1,權值為負分數的邊 原始點到偽點連一條容量為無窮,權值為0的邊。前者表示分數只能拿一次,後者表示第二次第三次 可以繼續走這個點,但是不拿分數。負權是因為題目要求的是 最大費用 又因為最多走同乙...