容易看出這是顯然的費用流模型。
把每天需要的餐巾數作為限制。需要將天數拆點,x』表示每天需要的餐巾,x』』表示每天用完的餐巾。所以加邊 (s,x',inf,0),(x'',t,inf,0).
餐巾可以新買。所以需要加邊(s,x'',inf,f)。
沒用完餐巾可以留到下一天,所以加邊(x',x+1',inf,0).
送往快洗店,加邊(x',x+a+1'',inf,fa). 送往慢洗店,加邊(x',x+b+1'',inf,fb).
跑一遍費用流即可。由於該圖是一種特殊的結構,類二分圖結構。用zkw費用流可以快速出解。
# include # includeview code# include
# include
# include
# include
# include
# include
# include
# include
# include
using
namespace
std;
# define lowbit(x) ((x)&(-x))
# define pi
3.1415926535
# define eps 1e-9
# define mod
100000007
# define inf
1000000000
# define mem(a,b) memset(a,b,
sizeof
(a))
# define for(i,a,n)
for(int i=a; i<=n; ++i)
# define fo(i,a,n)
for(int i=a; ii)
# define bug puts("h
");# define lch p
<<1
,l,mid
# define rch p
<<1|1,mid+1
,r# define mp make_pair
# define pb push_back
typedef pair
pii;
typedef vector
vi;# pragma comment(linker,
"/stack:1024000000,1024000000")
typedef
long
long
ll;int
scan()
void out(int
a)
if(a>=10) out(a/10
); putchar(a%10+'0'
);}const
int n=2005;//
code begin...
struct
edge
}edge[
50005
];struct
zkw_mincostmaxflow
void addedge(int u, int v, int cap, int
cost)
int aug(int u, int
flow)
}return0;
}bool
modify_label()
if (d==inf) return
false
; fo(i,
0,n) if (vis[i]) vis[i]=false, dis[i]+=d;
return
true
; }
pii mincostmaxflow(
int start, int end, int
nn)
if (!modify_label()) break
; }
return
mp(min_cost,max_flow);
}}solve;
intval[n];
intmain ()
printf(
"%d\n
",solve.mincostmaxflow(0,2*n+1,2*n+2
).first);
return0;
}
bzoj1221軟體開發 費用流
題目傳送門 思路 網路流拆點有的是 過程拆點 有的是 狀態拆點 這道題應該就屬於狀態拆點。每個點分需要用的,用完的。對於需要用的,這些毛巾來自新買的和用過的毛巾進行消毒的,流向終點。對於用完的,來自源點,可以用於消毒,連向需要用的點,還有一些毛巾留到明天消毒 其實意思是,消完毒,延後使用,但是這樣建...
BZOJ1221 HNOI2001 軟體開發
某軟體公司正在規劃一項n天的軟體開發計畫,根據開發計畫第i天需要ni個軟體開發人員,為了提高軟體開發人員的效率,公司給軟體人員提供了很多的服務,其中一項服務就是要為每個開發人員每天提供一塊消毒毛巾,這種消毒毛巾使用一天後必須再做消毒處理後才能使用。消毒方式有兩種,a種方式的消毒需要a天時間,b種方式...
bzoj1221 HNOI2001 軟體開發
time limit 10 sec memory limit 162 mb submit 1351 solved 748 submit status discuss 某軟體公司正在規劃一項n天的軟體開發計畫,根據開發計畫第i天需要ni個軟體開發人員,為了提高軟體開發人員的效率,公司給軟體人員提供了很...