又一次考試網路流爆零......
這一題一看就是網路流, 但是要怎麼構圖呢? 考慮到途中的一些因素, 首先, 每一種志願者控制的區間範圍為\(s_\)到\(t_\), 所以, 我們要使得每種志願者只能控制這段區間, 其他的不能夠控制, 其次, 每個時間都有乙個最小的值, 也就是這條邊(我們將時間段看為一條邊更加方便)有乙個下界, 想到了什麼, 上下界網路流, 每條邊都要符合上界和下界的約束, 沒有學過的可以戳一下.
那麼初始的構圖也就出來了, 每個時間作為一條邊, 那麼由\(i\)向\(i + 1\)連一條邊, 容量為\(inf - lower(i)\), 費用為0(由於人是控制一段區間的, 他在這段區間中的任意兩個點流費用都為0, 可以看做這個人繼續做事, 已經付錢了, 你得給我做完事才能走)(\(lower(i)\)代表時間\(i\)最少需要多少人, 其實這條邊容量為\(inf\)沒有問題, 假裝上界為\(inf + lower(i)\)就可以了, 反正可以不停地流), 考慮到之前所說, 每個點只能約束自己的一段區間, 有點像迴圈流, 從\(s_\)出發, 流到\(t_\)就重新流, 但是這裡由於\(t_\)被看成了一條邊, 所以我們需要在點\(t_ + 1\)往\(s_\)連一條容量為\(inf\), 費用為\(c\)的邊, 代表當前類\(i\)的志願者控制且只能控制\(s_\)到\(t_\)這段時間.
最終構圖是這樣的: 每個點\(i\)向\(i + 1\)連邊, 每個\(t_ + 1\)向\(s_\)連邊, 注意在每個點\(i\)向\(i + 1\)連邊時, 由於你是預設這條邊流了乙個下界的, 你每個點的流量不一定平衡, 記錄一下每個點流入和流出的差, 對於一條下界為\(x\)的邊i -> i + 1, 記\(delta[i]\)為點\(i\)流入與流出的差, 則\(delta[i] -= x\), \(delta[i + 1] += x\), 連完所有邊後, 注意到每個點的\(delta\)不一定為0, 對於\(delta\)大於或者小於0的情況, 戳上面那個吧, 有詳細的介紹, 最後跑一遍無源匯上下界最小費用可行流就可以了, 也就是在構出的有源匯的圖中跑一遍最小費用最大流即可.
具體**
#include #include #include #include #define n 2005
#define inf 1e9
using namespace std;
int n, m, s, t, delta[n], head[n], cnt = 1, p[n], vis[n];
struct node
edge[100005];
long long a[n], d[n];
inline int read()
while(c >= '0' && c <= '9')
return x * w;
}inline void add(int u, int v, long long w, long long cost)
; head[u] = cnt;
edge[++cnt] = ; head[v] = cnt;
}bool spfa(long long &cost)
}} }
if(d[t] == d[0]) return 0;
cost += (a[t] * d[t]);
for(int i = t; i != s; i = edge[p[i]].from)
return 1;
}int main()
for(int i = 1; i <= m; i++)
for(int i = 1; i <= n + 1; i++)
long long cost = 0;
while(spfa(cost));
printf("%lld\n", cost);
return 0;
}
洛谷P3980 志願者招募
題意 懶得寫了.解 一開始想的是每天建點,每種人建點,然後連邊費用流,發現乙個人可以管轄多天,不好處理。回想起了網路流24題中的 最長k可重線段集 最長k可重區間集 等問題,然後發現這題也可以橫著流啊。具體來說,首先在下面開一條安全快速綠色通道,存放那些不用的人 流量 那麼每天要用怎麼辦?把人逼出去...
P3980 NOI2008 志願者招募 網路流
題意 一共有n 天 每天需要ai個志願者 有m種志願者 每種志願者可以從 第si 天工作到ti 天 每個需要ci元 問花最少的錢滿足每天的需求 顯然是費用流 如果正常連邊的話 每個志願者對其輻射的天非常難處理 可以採用時間軸的連法 源點連第一天 匯點連最後一天 容量為inf費用為0 這樣跑網路流是沿...
洛谷 P3980 NOI2008 志願者招募
我居然現在才會用費用流解線性規劃 當然這裡解決的一類問題比較特殊 以式子作為點,變數作為邊,然後要求就是變數在不同的式子裡出現了兩次,係數一次為 1,一次為 1 這樣的話就作為了乙個出度和乙個入度,和邊正好對應了 我們設每種志願者選擇人數是 x 我們的限制是 left x geq 0 x x geq...