思路:floyd + 二分+ 最大流。
很容易想到最大流 建立一个超级源点和汇点把挤奶机和汇点连起来 容量为M ,奶牛与源点连起来 容量为1
先floyd求出每两个实体间的最小距离 然后二分找出最大
//788K
454MS
#include <stdio.h>
#include <string.h>
#define Max 300
#define inf 0x3f3f3f3f;
int dist[Max][Max],mat[Max][Max],pre[Max];
int K,C,M,src,des;
void Build (int
num)
//建图
{
(mat,0,sizeof(mat));
1+K; i <= des-1; i ++)
//在当前路径下能走一路线
for (int j = 1; j <= K; j ++)
if (dist[i][j] <= num)
mat[i][j] = 1;
1; i <= K; i ++)
mat[i][des] = M;
1+K; i <= des-1; i ++) //与源点相连
mat[src][i] = 1;
}
bool BFS ()
{
(pre,0xff,sizeof(pre));
que[Max];
0,rear = 0;
0;
= src;
!= rear)
int u = que[front++];
front = front % Max;
for (int v = 1; v <= des; v ++)
{
if (pre[v] != -1||mat[u][v] == 0)
continue;
pre[v] = u;
if (v == des)
return true;
que[rear++] = v;
rear = rear % Max;
}
false;
}
int EK
()
//EK算法 每回增广的容量只能1
{
0,i;
(BFS())
ans += 1;
for (i = des; i != src; i = pre[i])