二分答案+最大流。

对答案建图,若长度≤答案,连边即可。(先要预处理点对间的最短路)

当然得拆点,(否则,就此题而言,就会出现流量x-y不走x-y的最短路边的情况,而是走了一条路径 ,答案约束的仅仅是路径上的边长的最大值,而非总和)

流量:S - 某点入点 - 某点出点 - T

另外,由于此题卡实现,考虑二分边权集合,就酱


吐槽 第一次建图时“因为一头牛经过边(x,y,c)用时为c,所以对于时限t来说,这条边的容量为t/c。 ”woc我在想什么。。


#include <bits/stdc++.h>
#define int long long
using namespace std; const int N=4e2+7;
const int L=2e6+7;
const int inf=0x3f3f3f3f3f3f3f3f; int S=N-1,T=N-2;
int head[N],to[L],upp[L],last[L],cnt=1;
int que[N],lev[N],hd,tl; inline void add_edge(int x,int y,int u1,int u2=0) {
to[++cnt]=y,upp[cnt]=u1,last[cnt]=head[x],head[x]=cnt;
to[++cnt]=x,upp[cnt]=u2,last[cnt]=head[y],head[y]=cnt;
}
inline bool bfs() {
memset(lev,0,sizeof lev);
lev[S]=1;
que[hd=0,tl=1]=S;
while(hd<tl) {
int x=que[++hd];
for(int i=head[x]; i; i=last[i]) if(upp[i]>0 && !lev[to[i]])
lev[to[i]]=lev[x]+1, que[++tl]=to[i];
}
return lev[T]!=0;
}
int dfs(int x,int tf) {
if(x==T) return tf;
int tot=0,tmp;
for(int i=head[x]; i; i=last[i]) if(upp[i]>0 && lev[x]+1==lev[to[i]]) {
tmp=dfs(to[i],min(tf-tot,upp[i]));
if(tmp) upp[i]-=tmp,upp[i^1]+=tmp,tot+=tmp;
if(tot==tf) break;
}
if(!tot) lev[x]=-1;
return tot;
} int n,m,sum;
int s[210],p[210],dis[210][210]; struct edge {
int x,y,w;
bool operator<(const edge&d) const {
return w<d.w;
}
} c[40010];
int d[40010]; inline bool check(int lmt) {
cnt=1;
memset(head,0,sizeof head);
for(int i=1; i<=n; ++i) {
add_edge(S,i,s[i]);
add_edge(n+i,T,p[i]);
}
for(int i=1; c[i].w<=lmt && i<=m; ++i) {
add_edge(c[i].x,n+c[i].y,inf);
add_edge(c[i].y,n+c[i].x,inf);
}
int tot=0;
while(bfs()) tot+=dfs(S,inf);
return tot>=sum;
} signed main() {
scanf("%lld%lld",&n,&m);
memset(dis,0x3f,sizeof dis);
for(int i=1; i<=n; ++i) {
scanf("%lld%lld",s+i,p+i);
dis[i][i]=0;
sum+=s[i];
}
for(int i=1,x,y,w; i<=m; ++i) {
scanf("%lld%lld%lld",&x,&y,&w);
if(dis[x][y]>w) {
dis[x][y]=w;
dis[y][x]=w;
}
}
for(int k=1; k<=n; ++k) {
for(int i=1; i<=n; ++i) {
for(int j=1; j<=n; ++j) {
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
m=0;
for(int i=1; i<=n; ++i) {
for(int j=i; j<=n; ++j) {
if(dis[i][j]<inf) c[++m]=(edge){i,j,dis[i][j]};
}
}
sort(c+1,c+m+1);
int l=1,r=0,mid,ans=-1;
for(int i=1; i<=m; ++i) {
if(c[i].w!=c[i-1].w) d[++r]=c[i].w;
}
while(l<=r) {
mid=(l+r)>>1;
if(check(d[mid])) ans=d[mid],r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}

[P2402] 奶牛隐藏的更多相关文章

  1. 洛谷P2402 奶牛隐藏

    洛谷P2402 奶牛隐藏 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛混乱的原因看题目描述) 题目描述 在一个农场里有n块田地. ...

  2. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  3. P2402 奶牛隐藏 二分+网络流

    floyd搞出两点间最短距离 二分判答案 // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; ty ...

  4. luogu2402 奶牛隐藏

    题目描述 在一个农场里有n块田地.某天下午,有一群牛在田地里吃草,他们分散在农场的诸多田地上,农场由m条无向的路连接,每条路有不同的长度. 突然,天降大雨,奶牛们非常混乱,想要快点去躲雨.已知每个田地 ...

  5. Hello Build To Win!我们是奶牛小分队!——记第一次团队作业

    Hello Build To Win!我们是奶牛小分队! section 1 组建团队 1.  队员介绍: 姓名 学号 风格 擅长技术 编程兴趣 希望软工角色 吴建瑜 2016012024 努力学习, ...

  6. css样式之超出隐藏

    文本超出部分隐藏,总结两种方法. 1.单行隐藏 html代码 <div class="mi">当文字超过范围的时候,超出部分会隐藏起来.</div> css ...

  7. [jquery]显示隐藏div标签的几种方法

    1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...

  8. 使用Xamarin开发iOS7应用时隐藏StatusBar方法

    在iOS7之前如果需要隐藏StatusBar,比较简单,直接在AppDelegate.cs中使用如下代码就可以进行隐藏: UIApplication.SharedApplication.StatusB ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

随机推荐

  1. Linux firewalld使用教程+rhce课程实验

    --timeout= 设置规则生效300秒 调试阶段使用,防止规则设置错误导致无法远程连接 实验:在server0机器上部署httpd服务,通过添加富规则,只允许172.25.0.10/32访问,并且 ...

  2. .net like模糊查询参数化

    List<SqlParameter> paras = new List<SqlParameter>(); if (!string.IsNullOrEmpty(ciName)) ...

  3. [leetcode]34.Find First and Last Position of Element in Sorted Array找区间

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  4. redis集群密码设置

    1.密码设置(推荐)方式一:修改所有Redis集群中的redis.conf文件加入: masterauth passwd123 requirepass passwd123 说明:这种方式需要重新启动各 ...

  5. 【转载】通过sql server 连接mysql

    http://www.cnblogs.com/goole/p/5291286.html 1.在SQL SERVER服务器上安装MYSQL ODBC驱动; 驱动下载地址:http://dev.mysql ...

  6. MySQL优化(四) 慢查询的定位及优化

    一.SQL语句优化的一般步骤: (1)通过 show status 命令了解各种 SQL 的执行效率: (2)定位执行效率较低的 SQL 语句(重点是 Select): (3)通过 explain 分 ...

  7. java中date日期格式的各种转换

    示例 Date dt =new Date(); System.out.println(dt); //格式: Wed Jul 06 09:28:19 CST 2016 //格式:2016-7-6 Str ...

  8. Linux 第十三天

    十五.shell编程 1.Shell是什么 1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一 ...

  9. s2 Docker环境的快速搭建方法

    常规linux下安装 centos7 下配置docker源并安装 cat >/etc/yum.repos.d/docker.repo< [dockerrepo] name=Docker R ...

  10. 第39章:MongoDB-集群--Replica Sets(副本集)---副本集基本原理

    ①操作日志oplog Oplog是主节点的local数据库中的一个固定集合,按顺序记录了主节点的每一次写操作,MongoDB的复制功能是使用oplog来实现的,备份节点通过查询这个集合就可以知道需要进 ...