题意及思路和详细说明见
<a bref = "http://www.xuebuyuan.com/" taget = "_blank">my another blog</a>
#include<cstdio>
#include<cstring>
#define MAXN 250
#define INF 1000000
int dist[MAXN][MAXN];
int que[MAXN];
int map[MAXN][MAXN];
bool used[MAXN], level[MAXN][MAXN];
int N, M, K, C;
void Floyd() {
int temp;
for(int k = 1; k <= N; ++ k) {
for(int i = 1; i <= N; ++ i) {
if(dist[i][k] != INF) {
for(int j = 1; j <= N; ++ j) {
temp = dist[i][k] + dist[k][j];
dist[i][j] = temp < dist[i][j] ? temp : dist[i][j];
}
}
}
}
}
void map_make(int max) {
memset(map, 0, sizeof(map));
for(int i = 1; i <= K; ++ i) {
map[i][N + 1] = M;
}
for(int i = K + 1; i <= N; ++ i) {
map[0][i] = 1;
}
for(int i = K + 1; i <= N; ++ i) {
for(int j = 1; j <= K; ++ j) {
if(dist[i][j] <= max) {
map[i][j] = 1;
}
}
}
}
bool BFS() {
memset(used, 0, sizeof(used));
memset(level, 0, sizeof(level));
int front = 0, rear = 0;
que[rear ++] = 0;
used[0] = 1;
while(front < rear) {
int v = que[front];
front ++;
for(int i = 0; i <= N + 1; ++ i) {
if(!used[i] && map[v][i]) {
used[i] = 1;
level[v][i] = 1;
que[rear ++] = i;
}
}
}
if(used[N + 1]) {
return true;
}
return false;
}
int dfs(int u, int sum) {
if(u == N + 1) {
return sum;
}
int s = 0;
for(int i = 0; i <= N + 1; ++ i) {
if(level[u][i]) {
int t = dfs(i, map[u][i] < sum ? map[u][i] : sum);
map[u][i] -= t;
map[i][u] += t;
s += t;
}
}
return s;
}
int main() {
freopen("poj2112.txt", "r", stdin);
while(scanf("%d%d%d", &K, &C, &M) != EOF) {
N = K + C;
for(int i = 1; i <= N; ++ i) {
for(int j = 1; j <= N; ++ j) {
scanf("%d", &dist[i][j]);
if(dist[i][j] == 0) {
dist[i][j] = INF;
}
}
}
Floyd();
int l = 0, r = 25000;
while(l < r) {
int mid = l + r >> 1;
int ans = 0;
map_make(mid);
while(BFS()) {
ans += dfs(0, INF);
}
if(ans >= C) {
r = mid;
} else {
l = mid + 1;
}
}
printf("%d\n", r);
}
}