這是一道經典問題——題記
結果我還wa了幾發沒找到原因,我們很容易想到這張圖的o(n + m)點複雜度的建邊,我們把1~n的每個中轉站連線流為本身的需求到終點t,然後有m個事件,我們對應的連線到s上去,流為每個事件的價值。
然後就是用乙個總的價值去減去最大流,因為最大流跑出來的分為兩種情況:(一)、這個中轉站是我們要參與進來的;(二)、這個中轉站裡的費用是我們無意加進來的,實際上是不需要的(這時候肯定是事件產生價值小於了替換它的價值了)。
所以,最後直接用總的價值,減去最大流即可。
#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define inf 0x3f3f3f3f
#define half (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define lson lsn, l, mid
#define rson rsn, mid+1, r
#define ql lson, ql, qr
#define qr rson, ql, qr
#define myself rt, l, r
#define mp(x, y) make_pair(x, y)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn = 55007, s = 0, maxe = 3.1e5 + 7;
int n, m, head[maxn], cur[maxn], cnt, t;
struct node
};struct eddge
}edge[maxe];
inline void addeddge(int u, int v, int flow)
inline void _add(int u, int v, int flow)
int deep[maxn];
queueq;
inline bool bfs()}}
return deep[t];
}int dfs(int u, int dist)}}
return 0;
}inline int dinic()
return ans;
}inline void init()
int main()
for(int i=1, u, v, w; i<=m; i++)
ans -= dinic();
printf("%d\n", ans);
return 0;
}
NOI2006 最大獲利
description 新的技術正衝擊著手機通訊市場,對於各大運營商來說,這既是機遇,更是挑戰。thu集團旗下的cs t通訊公司在新一代通訊技術血戰的前夜,需要做太多的準備工作,僅就站址選擇一項,就需要完成前期市場研究 站址勘測 最優化等專案。在前期市場調查和站址勘測之後,公司得到了一共n個可以作為...
NOI2006 最大獲利
有n個中轉站,每乙個中轉站修建需要耗費一定費用。有m個使用者人群,每個使用者人群要通話需要有a b 兩個中轉站,滿足這個使用者人群後會獲利p。問最大獲利是多少?有正權,有負權,還有依賴關係,決定就是你啦,最大權值閉合子圖!建模就不分析了,套路題目。luogu 4174 bzoj 1497 cogs ...
NOI2006 最大獲利
把使用者和中轉站分成兩類,就是乙個二分圖了。注意到我們選擇了乙個使用者群,就必須要選擇對應的中轉站來付出代價。這不就是乙個最大權閉合子圖嘛 直接上最小割即可 如下 include include include include include include define s 0 define t ...