题目链接:http://poj.org/problem?id=2112

题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用;并告诉了产奶机、奶牛之间的两两距离Dij(0<=i,j<K+C)。

分析:

肯定不是费用流,是这样的,先跑一遍floyd,二分结果,满足就有这条边,否则就没有,看可不可以跑出c头奶牛。

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm> using namespace std; #define inf 0x3f3f3f3f
const int maxn = ; struct Edge
{
int from,to,cap,flow;
}; struct Dinic
{
int n,m,s,t;
vector<Edge> edge;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn]; void init()
{
for(int i=;i<maxn;i++)
G[i].clear();
edge.clear();
memset(d,,sizeof(d));
memset(vis,,sizeof(vis));
memset(cur,,sizeof(cur));
} void AddEdge (int from,int to,int cap)
{
edge.push_back((Edge){from,to,cap,});
edge.push_back((Edge){to,from,,});
m = edge.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool BFS()
{
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
for(int i=; i<G[x].size(); i++)
{
Edge & e = edge[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow)
{
vis[e.to] = ;
d[e.to] = d[x] + ;
Q.push(e.to);
}
}
}
return vis[t];
} long long DFS(int x,int a)
{
if(x==t||a==) return a;
long long flow = ,f;
for(int & i = cur[x]; i<G[x].size(); i++)
{
Edge & e = edge[G[x][i]];
if(d[x] + ==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
{
e.flow +=f;
edge[G[x][i]^].flow -=f;
flow +=f;
a-=f;
if(a==) break;
}
}
return flow;
} int Maxflow (int s,int t) {
this->s = s;this->t = t;
int flow = ;
while(BFS()) {
memset(cur,,sizeof(cur));
flow+=DFS(s,inf);
}
return flow;
}
}sol; int dist[maxn][maxn]; int main()
{
int k,c,m;
while(~scanf("%d%d%d",&k,&c,&m))
{ int l = inf,r=;
int z = k+c;
for(int i=; i<=z; i++)
{
for(int j=; j<=z; j++)
{
scanf("%d",&dist[j][i]);
if(dist[j][i] == )
{
dist[j][i] = inf;
}
}
} for(int kk=; kk<=z; kk++)
{
for(int i=; i<=z; i++)
{
for(int j=; j<=z; j++)
{
if(dist[k][j]<inf&&dist[i][j]>dist[i][k]+dist[k][j])
dist[i][j] =dist[i][kk]+dist[kk][j];
}
}
} for(int i=; i<=z; i++)
{
for(int j=i+; j<=z; j++)
{
if(dist[i][j]<inf)
l = min(l,dist[i][j]),r = max(r,dist[i][j]);
}
} int s = ,t=z+;
while(l<r)
{
int mid = l+(r-l)/;
sol.init(); for(int i=k+;i<=k+c;i++) {
sol.AddEdge(s,i,);
for(int j=;j<=k;j++) {
if(dist[i][j]<=mid) {
sol.AddEdge(i,j,inf);
sol.AddEdge(j,i,inf);
}
}
} for(int i=;i<=k;i++)
sol.AddEdge(i,t,m); if(sol.Maxflow(,z+)>=c)
{
r = mid;
}
else l = mid+;
}
printf("%d\n",l); }
return ;
}

最新文章

  1. Android之常见问题集锦Ⅰ
  2. 抓包工具PowerSniff-0.1
  3. CSS hack——不同浏览器的CSS应对法
  4. linux命令——磁盘管理cd
  5. 如何在 Windows Azure 的虚拟机 ubuntu 上面安装和配置 openVPN(二)
  6. HTML5之选择上传图片文件
  7. 单调队列-Hdu-4122-Alice&#39;s mooncake shop
  8. 高级DirectDraw
  9. Kali Linux ——在无网络情况下安装无线网卡驱动
  10. Cmake用法
  11. 关于使用CodeFirst,修改类或上下文时操作数据库报错解决方法
  12. 获取的是 string 类型的字段,直接输出 数字 或者 需要的第几行
  13. PHP判断一个JSON对象是否含有某一个属性的方法
  14. 树莓派2B+安装Debain操作系统
  15. Opening socket connection to server :2181. Will not attempt to authenticate using SASL (unknown error) hbase
  16. 混合高斯模型(Mixtures of Gaussians)
  17. java网络爬虫实现信息的抓取
  18. C++矩阵库 Eigen 简介
  19. linux安装python3(已有python2.x情况下)
  20. Http post请求数据带中文参数问题

热门文章

  1. eclipse中找不到base64包的解决方法
  2. python练习六十一:文件处理,读取文件内容
  3. IPM的修炼之路
  4. 连接虚机中的mysql服务
  5. rsync 命令中的路径斜线
  6. HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】
  7. kindeditor编辑区空格被隐藏,导致所见所得不一致的解决办法
  8. Newtonsoft.Json解析json字符串和写json字符串
  9. springboot2.x如何配置全局自定义异常
  10. Socket网络通信之BIO