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 }