題意:
這是一道最小費用(費用指單價)最大流的題目。
1.從原點向每一天晚上連一條流量為當天所用餐巾x,費用為0的邊,表示每天晚上從起點獲得x條髒餐巾。
2.從每一天早上向匯點連一條流量為當天所用餐巾x,費用為0的邊,每天白天,表示向匯點提供x條乾淨的餐巾,流滿時表示第i天的餐巾夠用 。 3.從每一天晚上向第二天晚上連一條流量為inf,費用為0的邊,表示每天晚上可以將髒餐巾留到第二天晚上(注意不是早上,因為髒餐巾在早上不可以使用)。
4.從每一天晚上向這一天+快洗所用天數t1的那一天早上連一條流量為inf,費用為快洗所用錢數的邊,表示每天晚上可以送去快洗部,在地i+t1天早上收到餐巾 。
5.同理,從每一天晚上向這一天+慢洗所用天數t2的那一天早上連一條流量為inf,費用為慢洗所用錢數的邊,表示每天晚上可以送去慢洗部,在地i+t2天早上收到餐巾 。
6.從起點向每一天早上連一條流量為inf,費用為購買餐巾所用錢數的邊,表示每天早上可以購買餐巾 。 注意,以上6點需要建反向邊!3~6點需要做判斷(即連向的邊必須<=n)
1 #include2 #include3 #include4 #include5 #include6#define inf 2147483647
7#define ll long long
8using
namespace
std;
9const
int maxn=1e5+10
;10 queueq;
11int n,m,m1,t1,m2,t2,num=-1
,st,ed;
12struct
nodeg[maxn];
15int
b[maxn],head[maxn],pre[maxn],pos[maxn],max_flow[maxn];
16ll dis[maxn];
17bool
vis[maxn];
18void build(int u,int v,int w,int
cost)
1923
bool
spfa()
2446}47
}48}49
return dis[ed]<4557430888798830399;50
}51ll flow()
5260}61
return
ans;62}
63int
main()
6474 scanf("
%d %d %d %d %d
",&m,&t1,&m1,&t2,&m2);
75for(int i=1;i<=n;i++)
81 printf("
%lld
",flow());
82 }
最小費用最大流
網 絡流的基本問題為 設乙個有向賦權圖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...