bzoj1070:

  把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]。

 1 #include <bits/stdc++.h>
 2 #define rep(i, a, b) for (int i = a; i <= b; i++)
 3 #define drep(i, a, b) for (int i = a; i >= b; i--)
 4 #define REP(i, a, b) for (int i = a; i < b; i++)
 5 #define mp make_pair
 6 #define pb push_back
 7 #define clr(x) memset(x, 0, sizeof(x))
 8 #define xx first
 9 #define yy second
10 using namespace std;
11 typedef long long i64;
12 typedef pair<int, int> pii;
13 const int inf = ~0U >> 1;
14 const i64 INF = ~0ULL >> 1;
15 //*********************************
16 
17 const int maxn = 605, maxm = 33005;
18 
19 struct Ed {
20     int u, v, nx, c, w; Ed() {}
21     Ed(int _u, int _v, int _nx, int _c, int _w) :
22         u(_u), v(_v), nx(_nx), c(_c), w(_w) {}
23 } E[maxm << 1];
24 int G[maxn], edtot;
25 void addedge(int u, int v, int c, int w) {
26     E[edtot] = (Ed){u, v, G[u], c, w};
27     G[u] = edtot++;
28     E[edtot] = (Ed){v, u, G[v], 0, -w};
29     G[v] = edtot++;
30 }
31 
32 bool vis[maxn]; int dis[maxn], s, t;
33 bool spfa() {
34     static int que[maxm]; int qh(0), qt(0);
35     rep(i, s, t) vis[i] = 0, dis[i] = 0x3f3f3f3f;
36     dis[que[++qt] = s] = 0; vis[s] = 1;
37     while (qh != qt) {
38         int x = que[++qh]; vis[x] = 0;
39         for (int i = G[x]; i != -1; i = E[i].nx) {
40             if (E[i].c && dis[E[i].v] > dis[x] + E[i].w) {
41                 dis[E[i].v] = dis[x] + E[i].w;
42                 if (!vis[E[i].v]) vis[que[++qt] = E[i].v] = 1;
43             }
44         }
45     }
46     return dis[t] != 0x3f3f3f3f;
47 }
48 int ans, cur[maxn];
49 int dfs(int u, int rm) {
50     vis[u] = 1;
51     if (u == t) return rm;
52     int rm1 = rm;
53     for (int &i = cur[u]; i != -1; i = E[i].nx) {
54         if (E[i].c && !vis[E[i].v] && dis[E[i].v] == dis[u] + E[i].w) {
55             int flow = dfs(E[i].v, min(rm, E[i].c));
56             E[i].c -= flow, E[i ^ 1].c += flow;
57             ans += flow * E[i].w;
58             if ((rm -= flow) == 0) break;
59         }
60     }
61     if (rm1 == rm) dis[u] = 0;
62     return rm1 - rm;
63 }
64 
65 int a[65][10];
66 int main() {
67     int m, n; scanf("%d%d", &m, &n);
68     rep(i, 1, n) rep(j, 1, m) scanf("%d", &a[i][j]);
69     s = 0, t = n + n * m + 1;
70     memset(G, -1, sizeof(G));
71     rep(i, 1, n) addedge(s, i, 1, 0);
72     rep(i, n + 1, n + n * m) addedge(i, t, 1, 0);
73     rep(i, 1, n) {
74         rep(j, 1, m) {
75             rep(k, 1, n) {
76                 addedge(i, n + (j - 1) * n + k, 1, k * a[i][j]);
77             }
78         }
79     }
80     while (spfa()) memcpy(cur, G, sizeof(G)),dfs(s, 0x3f3f3f3f);
81     printf("%.2lf\n", 1.0 * ans / n);
82     return 0;
83 }
View Code

相关文章:

  • 2022-02-05
  • 2021-11-25
  • 2021-07-23
  • 2021-07-31
  • 2022-01-31
  • 2021-07-14
  • 2021-06-04
猜你喜欢
  • 2022-03-05
  • 2021-08-12
  • 2021-10-12
  • 2021-05-18
  • 2021-11-05
  • 2021-08-19
  • 2022-02-07
相关资源
相似解决方案