最小費用最大流

2021-10-02 02:54:16 字數 1873 閱讀 5961

題目描述

同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同的車進行維修所用的時間是不同的。現在需要安排這m位技術人員所維修的車及順序,使得顧客平均等待的時間最小。

說明:顧客的等待時間是指從他把車送至維修中心到維修完畢所用的時間。

輸入格式

第一行有兩個數m,n,表示技術人員數與顧客數。

接下來n行,每行m個整數。第i+1行第j個數表示第j位技術人員維修第i輛車需要用的時間t。

輸出格式

最小平均等待時間,答案精確到小數點後2位。

輸入輸出樣例

輸入 #1

2 23 2

1 4輸出 #1

1.50

說明/提示

(2<=m<=9,1<=n<=60), (1<=t<=1000)

把m個師傅拆成mn個點,第(i,j)個點表示第i個師傅倒數第j個修車,再建n個點表示n輛車,mn個點都與第k輛車相連,花費是jc[k][i],流量為1。然後mn個點與源點相連,流量為1,花費為0,n輛車與匯點相連,流量為1,花費為0。

#include 

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int maxn =

200005

;const int inf

=2e9+1

;const int inf =

0x7f7f7f7f

;int n,m,cnt =1;

int head[maxn]

;int pre[maxn]

,cost[maxn]

,flow[maxn]

;int c[

105]

[105];

int maxflow,mincost;

bool vis[maxn]

;struct node

l[maxn]

;queueq;

void

add(int x,int y,int z,int w)

bool spfa

(int s,int t)}}

}return cost[t]

!= inf;

}void

mcmf

(int s,int t)}}

int main()

} s =

1,t =2;

for(int i=

1; i<=n*m; i++

)for

(int i=

1; i<=m; i++

)//第i個人第j個修車,修第k輛車}}

for(int i=

1; i<=n; i++

)mcmf

(s,t)

;printf

("%.2f"

,(double)mincost/

(double)n)

;}

平面上有 n 個點,每個點可以向比它縱座標小的點連邊,要求連成一顆二叉樹,使得邊長總和最小。

建圖:拆點,源點向每個點的入點連容量為2,費用為0的邊,每個點的出點連容量為1,費用為0的邊。對於邊(u,v),u的入點連向v的出點,費用為距離,容量為1。跑mcmf,若最大流不等於n-1,則無法連成二叉樹,否則最小費用即為答案。

有些題目中有某個節點必須經過幾次,或是某個東西必須要選的限制。通常通過滿流或是帶下界的網路流來控制下界,拆點限流來控制上界。

當某個點最多只能和k個點相連時,拆點時令源點向該點連一條容量為k的邊,當某個點最多只能被訪問k次時,令出點連一條容量為k的點到匯點。

最小費用最大流

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

最小費用最大流

const int maxn 250 const int maxm 62272 const int inf 0x4ffffff int n,m struct edge edge maxm int head maxn cnt void init void addedge int u,int v,int...

最小費用最大流

看了最小費用最大流的問題,感覺好難啊,想不到,關鍵就是想不到,知道模板什麼用,只是能a題僅此而已,要想學深真的不是件容易的事情啊。為此我總結了以下幾點供複習知識點或者是講課時用 網路流的費用 在實際應用中,與網路流有關的問題,不僅涉及流量,而且還有費用的因素。網路的每一條邊 v,w 除了給定容量ca...