Q: There are k milking machines and c cows. The distance between k + c entities is given, and the maximum distance between each cow is obtained from one milking machine. How can we minimize the distance between the cows.
Maximum Distance ,,,,
# Include <stdio. h> # include <string. h> # define N 500 # define inf 0x3fffffint map [N] [N], dis [N], gap [N], head [N], num, n, m, d, start, end, ans; struct edge {int st, ed, flow, next;} E [N * 40]; void addedge (int x, int y, int w) {E [num]. st = x; E [num]. ed = y; E [num]. flow = w; E [num]. next = head [x]; head [x] = num ++; E [num]. st = y; E [num]. ed = x; E [num]. flow = 0; E [num]. next = head [y]; head [y] = num ++;} int dfs (int u, int minflow) {if (u = end) return minflow; I Nt I, v, f, min_dis = ans-1, flow = 0; for (I = head [u]; I! =-1; I = E [I]. next) {if (E [I]. flow> 0) {v = E [I]. ed; if (dis [v] + 1 = dis [u]) {f = dfs (v, E [I]. flow> minflow-flow? Minflow-flow: E [I]. flow); E [I]. flow-= f; E [I ^ 1]. flow + = f; if (flow = minflow) break; if (dis [start]> = ans) return flow ;} min_dis = min_dis> dis [v]? Dis [v]: min_dis; }}if (flow = 0) {if (-- gap [dis [u] = 0) dis [start] = ans; dis [u] = min_dis + 1; gap [dis [u] ++;} return flow;} int isap () {int maxflow = 0; memset (dis, 0, sizeof (dis); memset (gap, 0, sizeof (gap); gap [0] = ans; while (dis [start] <ans) maxflow + = dfs (start, inf); return maxflow;} void makemap (int DD) {int I, j; memset (head,-1, sizeof (head )); num = 0; for (I = 1; I <= m; I ++) addedge (start, I + n, 1); for (I = 1; I <= n; I ++) addedge (I, end, D); for (I = n + 1; I <= n + m; I ++) for (j = 1; j <= n; j ++) {if (map [I] [j] <= DD & map [I] [j]! = 0) addedge (I, j, 1) ;}} int main () {int I, j, k, left, right, mid; while (scanf ("% d", & n, & m, & D )! =-1) {left = 0; right = 0; start = 0; end = n + m + 1; ans = end + 1; memset (map, 0, sizeof (map); for (I = 1; I <= n + m; I ++) for (j = 1; j <= n + m; j ++) scanf ("% d", & map [I] [j]); for (k = 1; k <= n + m; k ++) {for (I = 1; I <= n + m; I ++) {if (map [I] [k] = 0) continue; // 0 indicates not connected for (j = 1; j <= n + m; j ++) {if (map [k] [j] = 0 | I = j) continue; if (map [I] [j] = 0 | map [I] [j]> map [I] [k] + map [k] [j]) map [I] [j] = map [I] [k] + map [k] [j]; if (right <map [I] [j]) right = map [I] [j] ;}}while (left <right) {mid = (left + right)/2; makemap (mid ); int sum = isap (); if (sum = m) right = mid; else left = mid + 1;} printf ("% d \ n", right );} return 0 ;}