題解 最大獲利

2022-05-01 19:27:09 字數 1198 閱讀 3916

題目傳送門

給出 \(n\) 個使用者,\(m\) 個基站,每個使用者的需求為用 \(a,b\) 兩個基站,會產生 \(c\) 的收益。修基站也需要花費。問最大收益。

\(n\le 5000,m\le 50000\)

這個東西要用乙個叫做最大權閉合子圖的東西。大概意思就是求解,對於乙個圖,每個點有點權,你選了乙個點則它的後繼都必須選,問選出來的點權值之和最大是多少。對於這個問題我們可以最小割來做,\(s\) 往所有點權為正的點連,流量為點權,所有點權為負的點往 \(t\) 連,流量為點權絕對值。原圖上的邊流量改為 \(\infty\)。然後答案就是所有邊權為正的權值之和-最小割。

這個模型的含義就是:

對於 \(s\) 連向的點,如果割了這個邊,相同於不選。

對於連向 \(t\) 的點,如果割了這個邊,相當於選。

正確性和最優性應該顯然,應該每個方案都與原圖上的方案一一對應。

對於這個點,我們可以直接使用者連向基站就好了,使用者點權為收益,基站點權為-花費。然後直接套用上面的最大權閉合子圖即可。

#include using namespace std;

#define int register int

#define inf 0x3f3f3f3f

#define maxm 500005

#define maxn 60005

template void read (t &x)

template void read (t &x,args& ... args)

template void write (t x)

int n,m,p[maxn];

struct edgee[maxm];

int toop = 1,s,t,dep[maxn],cur[maxn],head[maxn];

void add_edge (int u,int v,int w),head[u] = toop;

e[++ toop] = edge ,head[v] = toop;

}bool bfs ()

} return dep[t];

}int dfs (int u,int flow)

if (!flow) dep[u] = 0;

return ans;

}int mincut ()

return res;

}signed main()

網路流 最大獲利

time limit 5 sec memory limit 64 mb submit 760 solved 377 submit status discuss 新的技術正衝擊著手機通訊市場,對於各大運營商來說,這既是機遇,更是挑戰。thu集團旗下的cs t通訊公司在新一代通訊技術血戰的前夜,需要做太...

NOI 06 最大獲利

新的技術正衝擊著手機通訊市場,對於各大運營商來說,這既是機遇,更是挑戰。thu 集團旗下的cs t 通訊公司在新一代通訊技術血戰的前夜,需要做太多的準備工作,僅就站址選擇一項,就需要完成前期市場研究 站址勘測 最優化等專案。在前期市場調查和站址勘測之後,公司得到了一共n 個可以作為通訊訊號中轉站的位...

BZOJ 1497, 最大獲利

傳送門 選擇合理方案新建基站,滿足部分使用者群需要,求最大獲利 淨獲利 獲益之和 投入成本之和 注意到類似於有向無環圖的性質,套用最小割模型中的最大權閉合圖即可。include include const int inf 0u 2,v 55005,e 320005 int n,m,s,t,x,y,z...