BZOJ1221 [HNOI2001] 軟體開發

來源:互聯網
上載者:User

標籤:

這題面和軟體有個。。。毛關係啊!!!

建圖什麼的還是挺好想的。。。懶得寫了,copy from AutSky_JadeK:"

把每天分為二分圖兩個集合中的頂點Xi,Yi,建立附加源S匯T。

1、從S向每個Xi連一條容量為ri,費用為0的有向邊。

2、從每個Yi向T連一條容量為ri,費用為0的有向邊。

3、從S向每個Yi連一條容量為無窮大,費用為p的有向邊。

4、從每個Xi向Xi+1(i+1<=N)連一條容量為無窮大,費用為0的有向邊。

5、從每個Xi向Yi+m+1(i+m+1<=N)連一條容量為無窮大,費用為f的有向邊。

6、從每個Xi向Yi+n+1(i+n+1<=N)連一條容量為無窮大,費用為s的有向邊。

求網路最小費用最大流,費用流值就是要求的最小總花費。"

補充:S、T分別表示毛巾來源和公司

 

 1 /************************************************************** 2     Problem: 1221 3     User: rausen 4     Language: C++ 5     Result: Accepted 6     Time:1736 ms 7     Memory:1780 kb 8 ****************************************************************/ 9  10 #include <cstdio>11 #include <algorithm>12  13 using namespace std;14 const int N = 2005;15 const int M = N * 30;16 const int inf = (int) 1e9;17  18 struct edges {19     int next, to, f, cost;20     edges() {}21     edges(int _n, int _t, int _f, int _c) : next(_n), to(_t), f(_f), cost(_c) {}22 } e[M];23  24 int n, S, T;25 int first[N], tot = 1;26 int d[N], g[N], q[N];27 bool v[N];28  29 inline void Add_Edges(int x, int y, int f, int c) {30     e[++tot] = edges(first[x], y, f, c), first[x] = tot;31     e[++tot] = edges(first[y], x, 0, -c), first[y] = tot;32 }33   34 inline int calc() {35     int flow = inf, x;36     for (x = g[T]; x; x = g[e[x ^ 1].to])37         flow = min(flow, e[x].f);38     for (x = g[T]; x; x = g[e[x ^ 1].to])39         e[x].f -= flow, e[x ^ 1].f += flow;40     return flow;41 }42   43 bool spfa() {44     int x, y, l, r;45     for (x = 1; x <= T; ++x)46         d[x] = inf;47     d[S] = 0, v[S] = 1, q[0] = S;48     for(l = r = 0; l != (r + 1) % N; ++l %= N) {49         for (x = first[q[l]]; x; x = e[x].next)50             if (d[q[l]] + e[x].cost < d[y = e[x].to] && e[x].f) {51                 d[y] = d[q[l]] + e[x].cost, g[y] = x;52                 if (!v[y])53                     q[++r %= N] = y, v[y] = 1;54             }55         v[q[l]] = 0;56     }57     return d[T] != inf;58 }59  60 inline int work() {61     int res = 0;62     while (spfa())63         res += calc() * d[T];64     return res;65 }66  67 int main() {68     int i, a, b,f, fa, fb, x;69     scanf("%d%d%d%d%d%d", &n, &a, &b, &f, &fa, &fb);70     S = n * 2 + 1, T = S + 1;71     for (i = 1; i <= n; ++i) {72         if (i + 1 <= n) Add_Edges(i, i + 1, inf, 0);73         if (i + a + 1 <= n) Add_Edges(i, n + i + a + 1, inf, fa);74         if (i + b + 1 <= n) Add_Edges(i, n + i + b + 1, inf, fb);75         Add_Edges(S, n + i, inf, f);76         scanf("%d", &x);77         Add_Edges(S, i, x, 0);78         Add_Edges(n + i, T, x, 0);79     }80     printf("%d\n", work());81 }
View Code

(p.s.  那個、、、rank 1的0ms是怎麼做到的←_←)

BZOJ1221 [HNOI2001] 軟體開發

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.