解題思路:
首先要知道怎麼寫最大流,不懂的可以先轉個場:**網路流
那麼最小費用最大流就是現在每個邊不只有容量了,還有乙個花費,就是單位流量流過要的花費。
要求你求出在最大流的情況下的最小花費,所以之前我們再求最大流不考慮花費的情況下,只要能達到最大流就可以了,並不用去考慮流量是走哪些邊的,現在就是要考慮了。
那麼在建邊的時候正向邊的花費就是我們求得的值,反向邊就是相應的負值,因為當"反悔"的時候這條邊是不走了,要把之前的花費還回去。
這題我們還需要構造乙個超級源點和超級匯點,源點和人構造連線,房子和匯點構造連線就構成了乙個網路流.初始化所有邊的容量都是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中的每條邊 ...