hdu 1533 最小費用最大流

2021-08-21 15:08:33 字數 1326 閱讀 7561

解題思路:

首先要知道怎麼寫最大流,不懂的可以先轉個場:**網路流

那麼最小費用最大流就是現在每個邊不只有容量了,還有乙個花費,就是單位流量流過要的花費。

要求你求出在最大流的情況下的最小花費,所以之前我們再求最大流不考慮花費的情況下,只要能達到最大流就可以了,並不用去考慮流量是走哪些邊的,現在就是要考慮了。

那麼在建邊的時候正向邊的花費就是我們求得的值,反向邊就是相應的負值,因為當"反悔"的時候這條邊是不走了,要把之前的花費還回去。

這題我們還需要構造乙個超級源點和超級匯點,源點和人構造連線,房子和匯點構造連線就構成了乙個網路流.初始化所有邊的容量都是1,我們構造的連線的花費就是0了,原來的邊多少花費就是多少,

求解步驟:

1.先用最短路演算法(spfa,dij..想用啥用啥)在圖上跑出源點到匯點的最短路徑(對於花費來說的),當然邊的限制跟增廣路一樣必須路徑上的每條邊殘量都大於0.

2.求出這條路徑的最大增大流量(mins),然後用dis[t]*mins,dis[t]就是到匯點的最短距離.這個就是當前最優增廣路的花費。

3.最短路徑的增廣路也要跟網路流的操作一樣,殘量網路也要改變,即正向邊-=擴增流量,反向邊+=擴增流量。

4.重複上面1-3操作,直到沒有最短路徑的增廣路,最後答案就是增廣得到的花費和.

#include#define inf 0x3f3f3f3f

using namespace std;

const int mx = 4e2 + 10;

typedef long long ll;

int n,m,head[mx],tot,hi[mx][2],mi[mx][2];

char str[mx][mx];

struct node

edge[mx<<5];

int s,t,dis[mx],pre[mx];

bool vis[mx];

void addedge(int x,int y,int v,int c)

; head[x] = tot++;

}bool spfa()

}} }

return dis[t] != inf;

}int mincost()

ans += mins*dis[t];

} return ans;

}int main()

if(str[i][j]=='h')

}} s = 0, t = 2*n + 1;

for(int i=1;i<=n;i++)

} printf("%d\n",mincost());

} return 0;

}

HDU 1533 最小費用最大流(模板)

這道題直接用了模板 題意 要構建乙個二分圖,家對應人,連線的權值就是最短距離,求最小費用 要注意void init int n 這個函式一定要寫 一開始忘記寫這個wa了好幾發 還有這個題很容易t掉,賦值建圖要簡化,一開始構建成網路流那種圖一直t include include include inc...

hdu 1533 最小費用最大流模板題

這一題雖然說是模板題,但作為學習了最小費用最大流過程之後的第一題,模型的建立還是一臉懵比,之後通過見識相關的變形再來磨練建模的能力吧 如下是網上題解中關於本題中網路流的建模 1.所有人到所有的房子均建容量為1,費用為人到房子的曼哈頓距離的流 2.建立超級源點s,s到所有人均建容量為1,費用為0的流 ...

最小費用最大流

網 絡流的基本問題為 設乙個有向賦權圖g v,e v 其中有兩個特殊的節點s和s s稱為發點,s 稱為收點。圖中各 邊的方向和權數表示允許的流向和最大可能的流量 容量 問在這個網路圖中從發點流出到收點匯集,最大可通過的實際流量為多少?流向的分布情況為怎樣?設有乙個網路圖g v,e v e中的每條邊 ...