1. 程式人生 > >2018 BUPT Summer Training 網路流 by 月加 題集總結

2018 BUPT Summer Training 網路流 by 月加 題集總結

A - Drainage Ditches POJ - 1273 簡單模板題 B - Friendship POJ - 1815 大致題意:時限2秒,給出200個點,5000 條邊的無向圖,以及S和T,問將S和T分割開來最少需要刪去多少個點,以及最小字典序的割點集合

建圖方法:每個點分割成入點和出點,之間連容量為1的邊;對於原來的圖中的連邊,則從起點的出點 向 終點的入邊建立一條容量為極大值的邊。

直接建立圖,求最小字典序的割邊的集合時,按順序依次將每條邊從圖中暫時拿去,重新建圖再跑最大流,如果此時的最大流比前一次的最大流小的話,則該條邊是割邊,並將其從圖中永久刪去。直到最大流為0的時候停止尋找割邊。

D -

Number HYSBZ - 3275 題意: 有N(n<=3000)個正整數,需要從中選出一些數,使這些數的和最大。若兩個數a,b同時滿足以下條件,則a,b不能同時被選 1:存在正整數C,使aa+bb=c*c 2:gcd(a,b)=1

解法:如果兩個數互質,則這兩個必定一個為奇,一個為偶,則可以將數分為兩類,源向代表奇數的點連一條容量為該點的數值的邊,代表偶數的點向匯連一條容量為該點的數值的邊。如果某兩個數滿足題目給出的條件,則在這兩個數對應的點之間建立一條容量為極大值的邊。於是,如果存在從S到T的流量就意味著存在一對滿足關係的點。最後求出最小割,就是意味著把所有滿足關係的點對的其中一個去掉的最小代價。再用所有的數值之和減去最小代價就是該題的答案。

E - 軟體開發 HYSBZ - 1221 大致題意:有n天,每天需要a[i]a[i]塊消毒毛巾,有3種消毒毛巾的獲取方法:

  1. 直接購買新的消毒毛巾,每塊消毒毛巾費用為f
  2. 把這一天有的毛巾進行消毒,經過a天,每塊消毒毛巾費用為fa
  3. 把這一天有的毛巾進行消毒,經過b天,每塊消毒毛巾費用為fb 問經過n天以後最小總費用為多少。

解法:將每個點分成A點和B點,所有的A點向匯點連一條容量為a[i]a[i],費用為0的邊;從源點向每個A點連一條容量為極大值,費用為ff的邊;從源點向每個B點連一條容量為a[i]a[i],費用為00的邊;所有的B[i]B[i]點向A[i+a+

1]A[i+a+1]點連一條容量為極大值,費用為fafa的邊;所有的B[i]B[i]點向A[i+b+1]A[i+b+1]點連一條容量為極大值,費用為fbfb的邊;所有的B[i]B[i]點向B[i+1]B[i+1]點連一條容量為極大值,費用為00的邊。

解法:把每個代表工人的點拆成n個點,分別代表第1,2,3…n次修理,每輛車向這些點連容量為1,費用為g[i][j]kg[i][j]*k,表示第ii個工人倒數第kk次修理的車輛為第jj輛給總等待時間帶來的增量。然後從源點向所有代表車輛的點連容量為1,費用為0 的邊,所有代表工人的點向匯點連容量為1,費用為0 的邊。

G - Firing POJ - 2987 大致題意:開除每個員工會帶來對應的收益或者損失,開除一個員工同時也會開除其所有的下屬,下屬的下屬…給出開除員工的收益或損失,以及上司和下屬關係(一個員工可能會有多個上司),問開除員工的最大收益是多少,獲得最大收益時最少需要開除多少員工。

解法:從源點向所有開除後獲得收益的員工連一條容量為收益量的邊;所有開除後導致損失的員工向匯點連一條容量為損失量的邊;對於所有的下屬關係建立一條從上司到下屬,容量為極大值的邊。則答案為收益的總和減去最大流。其中開除的員工即為,去掉所有的滿流邊以後,和S相連的點。

理解:假設只有一個員工會帶來收益,則如果從該點到匯點的最小割大於其收益,也就是源點到該點的邊滿流了,表示開除該員工帶來的總利潤為非正數,為答案帶來的總利潤為收益值減去最小割,也就是0; 相對應的,如果源點到該點沒有滿流,表示開除該員工帶來的總利潤為正值,為答案帶來的總利潤值為收益值減去最小割。 對於一個可以帶來收益的員工的集合也是一樣的。

H - Being a Hero HDU - 3251 給出一個圖(n<=1e3,m<=1e5),每條邊都帶有邊權,有些點有收益值,問刪去某些邊以後,和1號點相隔離的點的收益之和減去刪去的邊的邊權之和最大為多少,以及刪去哪些邊。

解法:定1號點為源點,從所有的收益點向匯點連容量為收益值的邊,其他點之間的連邊的容量為該邊的邊權。答案是所有的收益點的收益之和減去最大流,刪去的邊為那些,跑完最大流以後的殘量網路中,從1號點可達的點到1號點到不可達的點的滿流邊。

理解:先考慮只有一個收益點的情況下,則如果從1號點到該收益點的最小割大於其收益,即將這個收益點和1號點隔開的總利潤為負數,否則利潤為正數。再考慮對於一個收益點的集合,也是一樣的。

I - 志願者招募 HYSBZ - 1061 大致題意: 給定長度為n的目標序列A,和m種操作,每種操作可以使用無限次,每次操作可以將序列L[i]L[i]R[i]R[i]的值加1,費用為C[i]C[i]。初始序列B長度為n,值全為0。問序列B進行操作後,直到對於所有1in{1 \le i \le n}都滿足B[i]A[i]B[i] \ge A[i]所需的最小代價和。

解法:先把序列A做一次差分,對於每個差分後的A[i]A[i],如果為負數,則從源點向ii點連一條容量為A[i]|A[i]|,費用為0的邊;如果為正數,則從ii點向匯點連一條容量為A[i]A[i],費用為0的邊。從每個r[i]+1r[i]+1點向l[i]l[i]點連一條容量為極大值,費用為C[i]C[i]的邊。最後從點ii向點i+1i+1連一條容量為極大值,費用為0的邊。

理解:到每個節點的流量可以理解為當前點的差分值。而題目要求為每個當前差分值都不少於序列A的差分序列B對應的B[i]B[i]。對於每個B[i]B[i],如果為正數,則從對應的點向匯點連容量為B[i]B[i],費用為0的邊,表示限制該點的當前差分值不應該少於B[i]B[i],否則從源點向該點連容量為B[i]-B[i],費用為0的邊,表示從該點以後的當前差分值都可以相對地提高B[i]-B[i],這個稍微想一下就可以知道為什麼了。而操作則對應的轉化為了從後向前連的邊,表示將右端點的當前差分值降低,左端點的當前差分值提升,在原序列上就表現為區間加法。 注意在建圖的時候需要將差分得到的第n+1個點也要考慮進去。