题意:给一堆点,一部分是牛,一部分是机器,每头牛必须要走到一个机器,每个点之间有距离,要求每头牛都能找得到一台机器(机器有最大容量)的情况下,走的最远的牛距离最小

题解:二分答案,小于该距离的边才能加进来,先用floyd预处理距离,然后跑最大流看满不满足条件

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; struct edge{
int to,Next,c;
}e[maxn<<];
int cnt,head[N];
int dis[N];
int d[N][N];
void add(int u,int v,int c)
{
// cout<<u<<" "<<v<<" "<<c<<endl;
e[cnt].to=v;
e[cnt].c=c;
e[cnt].Next=head[u];
head[u]=cnt++;
e[cnt].to=u;
e[cnt].c=;
e[cnt].Next=head[v];
head[v]=cnt++;
}
bool bfs(int s,int t)
{
memset(dis,-,sizeof dis);
dis[s]=;
queue<int>q;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
if(x==t)return ;
for(int i=head[x];~i;i=e[i].Next)
{
int te=e[i].to;
if(dis[te]==-&&e[i].c>)
{
dis[te]=dis[x]+;
q.push(te);
}
}
}
return ;
}
int dfs(int x,int mx,int t)
{
if(x==t)return mx;
int flow=;
for(int i=head[x];~i;i=e[i].Next)
{
int te=e[i].to,f;
if(e[i].c>&&dis[te]==dis[x]+&&(f=dfs(te,min(mx-flow,e[i].c),t)))
{
e[i].c-=f;
e[i^].c+=f;
flow+=f;
}
}
if(!flow)dis[x]=-;
return flow;
}
int maxflow(int s,int t)
{
int ans=,f;
while(bfs(s,t))
{
while((f=dfs(s,inf,t)))ans+=f;
}
return ans;
}
void init()
{
cnt=;
memset(head,-,sizeof head);
}
int n,m,k;
bool ok(int x,int s,int t)
{
init();
for(int i=+n;i<=n+m;i++)add(s,i,);
for(int i=;i<=n;i++)add(i,t,k);
for(int i=+n;i<=n+m;i++)
for(int j=;j<=n;j++)
if(d[i][j]<=x)
add(i,j,d[i][j]);
return maxflow(s,t)>=m;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(d,inf,sizeof d);
for(int i=;i<=n+m;i++)d[i][i]=;
for(int i=;i<=n+m;i++)
{
for(int j=;j<=n+m;j++)
{
int x;
scanf("%d",&x);
if(x)d[i][j]=x;
}
}
for(int i=;i<=n+m;i++)
for(int j=;j<= n+m;j++)
for(int k=;k<=n+m;k++)
d[j][k]=min(d[j][k],d[j][i]+d[i][k]);
/* for(int i=1+n;i<=n+m;i++)
{
for(int j=1;j<=n;j++)
cout<<d[i][j]<<" ";
cout<<endl;
}*/
int s=n+m+,t=n+m+;
int l=,r=inf;
while(r-l>)
{
int m=(l+r)/;
if(ok(m,s,t))r=m;
else l=m;
}
printf("%d\n",r);
}
return ;
}
/******************** ********************/

最新文章

  1. 详解Javascript中正则表达式的使用
  2. 更改android AVD模拟器创建路径位置的方法
  3. CSS中 opacity的设置影响了index(层数)的改变
  4. Educational Codeforces Round 15 D 数学推公式
  5. Android之Handler探索
  6. 最好的JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素
  7. boost之ThreadPool
  8. tomcat的webappclassloader中一个奇怪的异常信息
  9. Spring + Spring MVC + Hibernate项目开发集成(注解)
  10. MySQL的数据类型,MySQL增删改--添加主外键、添加属性、删除主外键、改表名、获取系统当前时间等
  11. Windows8.1 与Ubuntu14.04双系统
  12. python爬取大众点评
  13. 爬虫必备 User-Agent 列表
  14. django学习:一些疑惑
  15. XamarinSQLite教程创建数据库
  16. nginx 方向代理 jenkins
  17. MySQL数据库索引之B+树
  18. MongoDB(五)-- 副本集(replica Set)
  19. 【JMeter】集合点的设置
  20. 二:Jquery-action

热门文章

  1. ehcache.xml配置详解
  2. dbUtils 工具类介绍
  3. 洛谷 P1640 [SCOI2010]连续攻击问题
  4. centos6.9下php7安装zip扩展
  5. Windows Server 2003 R2 With Sp2 序列号
  6. sqlserver整理的实用资料
  7. cut命令学习
  8. &#39;is&#39; in Python
  9. JAVA中遍历Map和Set方法,取出map中所有的key
  10. 本地yum源建立