现在的位置: 首页 > 综合 > 正文

poj 2112 Optimal Milking(floyd+…

2018年03月17日 ⁄ 综合 ⁄ 共 1157字 ⁄ 字号 评论关闭
题意:有K台挤奶机、C头奶牛,以及他们之间距离,每只奶牛都要走到任意一台机器中,每台机器最多为M只奶牛服务,问所有奶牛都完成任务,所走的路程最远的那只奶牛,所走的路程最短可以是多少。

思路: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)     
//建图
{
    memset
(mat,0,sizeof(mat));
    for (int i =
1+K; i <= des-1; i ++) 
//在当前路径下能走一路线
       
for (int j = 1; j <= K; j ++)
           
if (dist[i][j] <= num)
               
mat[i][j] = 1;
    for (int i =
1; i <= K; i ++)  //与汇点相边
       
mat[i][des] = M;
    for (int i =
1+K; i <= des-1; i ++) //与源点相连
       
mat[src][i] = 1;
}

bool BFS ()
{
    memset
(pre,0xff,sizeof(pre));
    int
que[Max];
    int front =
0,rear = 0;
    pre[src] =
0;
    que[rear++]
= src;
    while (front
!= 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;
       
}
    }
    return
false;
}

int EK
()     
//EK算法 每回增广的容量只能1
{
    int ans =
0,i;
    while
(BFS())
    {
       
ans += 1;
       
for (i = des; i != src; i = pre[i])
     

抱歉!评论已关闭.