標籤:
這題面和軟體有個。。。毛關係啊!!!
建圖什麼的還是挺好想的。。。懶得寫了,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] 軟體開發