洛谷傳送門
題意:有n個中轉站建造方案,每個中轉站有乙個建造的費用,有m個使用者群,每個使用者群能帶來一定的收益,但是每個使用者群都會指定兩個中轉站必須建造,問最大可能收益
思路:
最大權閉合圖:
定義:在有向圖中,每個點有乙個權值,取乙個點集,使得沒有乙個點有向外指的邊,這樣的權值最大的點集。
可以發現當我們選了乙個點,這個點指向的點也一定要選。 於是可以和這道題對應起來,當我們選了乙個使用者群,這個使用者群指定的中轉站也必須建造,可以發現這裡如果用最大權閉合圖來做的話可以不止指定兩個中轉站。
最大權閉合圖的建圖方式:將所有點權為正的和點權為負的分開,乙個和源點連容量為點權絕對值的邊,另乙個和匯點連容量為點權絕對值的邊,跑一遍最小割(最大流),用所有正的點權和減去這個最小割就是答案
但是由於這題每個使用者只指定了兩個中轉站,這題還可以用最大密度子圖做
此時每個使用者群是一條邊(剛才是點,)
最大密度子圖:(帶邊權和點權)
定義:找出原圖的乙個子圖,使得這個子圖的邊權比上點權的最大的比值。
採用0-1整數規劃的思想來求最優解。使用二分查詢的方法來求g(h)
∣ e′
∣+∣v
′∣∣v
′∣=g
\frac = g
∣v′∣∣e
′∣+∣
v′∣
=g, 這題要最大化∣e′
∣+∣v
′∣
|e'| + |v'|
∣e′∣+∣
v′∣, g取0,
建圖:每個使用者群要求的兩個中轉站直接連一條為使用者群收益的邊,源點到每個使用者群連一條容量為偏移量的邊,每個使用者群到匯點連一條為−度數
−2×中
轉站建造
費用的邊
2\frac}
2−度數−2
×中轉站
建造費用
的邊ans
=n×m
x−ma
xflo
w2
ans= \frac
ans=2n
×mx−
maxf
low
(mx是邊權變為正的偏移量)
最大權閉合圖:
#include
using
namespace std;
typedef
long
long ll;
struct edge };
struct dinic
bool
bfs()}
}return vis[t];}
ll dfs
(ll x, ll a)
}return flow;
} ll maxflow
(ll s, ll t)
return flow;
}} mf;
const
int inf =
0x3f3f3f3f
;int
main()
int ans =0;
for(
int i =
1, a, b, c; i <= m;
++ i)
cout << ans - mf.
maxflow
(s, t)
;return0;
}
最大密度子圖
#include
using
namespace std;
typedef
long
long ll;
struct edge };
struct dinic
bool
bfs()}
}return vis[t];}
ll dfs
(ll x, ll a)
}return flow;
} ll maxflow
(ll s, ll t)
return flow;
}} mf;
const
int n =
5010
;int p[n]
, du[n]
;int
main()
for(
int i =
0, u, v, c; i < m;
++ i)
int mx =0;
for(
int i =
1; i <= n;
++ i)
for(
int i =
1; i <= n;
++ i)
cout <<
(n * mx - mf.
maxflow(0
, n +1)
)/2;
}
P4174 NOI2006 最大獲利
最小割看很多人都是用最大權閉合子圖來做的,其實就是對於每個使用者 節點都建立點,然後使用者是正權 獲得收益 通訊節點是負權 需要成本 然後使用者向所需要的節點連邊,表示如果想得到這個正權,就必須把所需的負權節點也選上 也就是所選子圖必須閉合 所以就用常規的做法,建模成網路流,s 向所有節點連流量為成...
洛谷P4174 NOI2006 最大獲利
新的技術正衝擊著手機通訊市場,對於各大運營商來說,這既是機遇,更是挑戰。thu 集團旗下的 cs t 通訊公司在新一代通訊技術血戰的前夜,需要做太多的準備工作,僅就站址選擇一項,就需要完成前期市場研究 站址勘測 最優化等專案。在前期市場調查和站址勘測之後,公司得到了一共 n 個可以作為通訊訊號中轉站...
luoguP4174 NOI2006 最大獲利
獲得一條邊的價值必須選上兩點,這一看就是最大權閉合子圖。先將所有價值選上。從 s 向每個使用者 i 連容量為 c i 的邊,從每個中轉站 i 向匯點連容量為 cost i 的邊,對於每個使用者 i 從 i 向 a i 和 c i 連容量為 inf 的邊。之後跑最小割,用答案減去即可。code inc...