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

今天掉坑多次。

做了几道题,发现从源点出来的边和进入汇点的边都在题目中出来过。

POJ真是坑,交G++一直wa,检查代码检查了好几遍,无望看discuss,才知道交C++是RE,才知道数组越界了。

手写了Floyd,写成 i,j,k,wa了,突然想到以前遇到过这种问题。

看昂神解释明白了。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define next Next
const int inf = 0x3f3f3f3f;
const int maxn=;
int level[maxn];
int iter[maxn];
int head[maxn],tot;
struct edge{
int to,cap,Next;
} e[]; ///此处应为边的两倍,加一条容量为0的反向边
void init(){
memset(head,-,sizeof(head));
tot=;
}
void add(int from,int to,int cap){
e[tot].Next=head[from];
e[tot].to=to;
e[tot].cap=cap;
head[from]=tot;
tot++;
}
void addedge(int from,int to,int cap){
add(from,to,cap);
add(to,from,);
}
void bfs(int s){
memset(level,-,sizeof(level));
queue<int> q;
level[s]=;
q.push(s);
while(!q.empty()){
int v=q.front(); q.pop();
for(int i=head[v];~i;i=e[i].Next){
edge &ed=e[i];
if(ed.cap>&&level[ed.to]<){
level[ed.to]=level[v]+;
q.push(ed.to);
}
}
}
}
int dfs(int v,int t,int f){
if(v==t) return f;
for(int &i=iter[v];~i;i=e[i].Next){
edge &ed=e[i];
if(ed.cap>&&level[v]<level[ed.to]){
int d=dfs(ed.to,t,min(f,ed.cap));
if(d>){
ed.cap-=d;
e[i^].cap+=d;
return d;
}
}
}
return ;
}
int max_flow(int s,int t){
int flow=;
while(){
bfs(s);
if(level[t]<) return flow;
memcpy(iter,head,sizeof(iter));
int f;
while((f=dfs(s,t,inf))>){
flow+=f;
}
}
}
int niu[maxn],capacity[maxn];
typedef long long ll;
ll dp[maxn][maxn];
void floyd(int n)
{
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
//if(i==j) continue;
for(int j=;j<=n;j++)
{
if(i==k||j==k||i==j) continue;
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
}
int f,p;
void cons(ll T,int s,int t)
{
init();
for(int i=;i<=f;i++)
{
addedge(s,i,niu[i]);
addedge(i,i+f,inf);
addedge(i+f,t,capacity[i]);
}
for(int i=;i<=f;i++)
{
for(int j=;j<=f;j++)
{
if(i==j) continue;
if(dp[i][j]<=T)
{
addedge(i,j+f,inf);
}
}
}
}
int main()
{
int sum = ;
scanf("%d %d",&f,&p);
for(int i=;i<=f;i++)
{
scanf("%d %d",&niu[i],&capacity[i]);
sum += niu[i];
}
for(int i=;i<=f;i++)
{
for(int j=;j<=f;j++)
{
dp[i][j] = 1e15;
}
}
for(int i=;i<=p;i++)
{
int x,y;
ll w;
scanf("%d %d %lld",&x,&y,&w);
dp[x][y] = min(dp[x][y],w); ///一定要注意两点之间的有多条边的情况
dp[y][x] = dp[x][y];
}
floyd(f);
ll l = ,r = 2000000000000LL;
ll mid = ;
int s,t;
s = ,t = ; ///s,t一定要在head数组范围内
int flow = ;
ll ans = ;
while(l<=r)
{
mid = (l+r)/2LL;
cons(mid,s,t);
flow = max_flow(s,t);
// printf("%lld %d\n",mid,flow);
if(flow==sum)
{
ans = mid;
r = mid-;
}
else
{
l = mid+;
}
}
if(ans==)
{
puts("-1");
}
else
{
printf("%lld\n",ans);
}
return ;
}
/*
3 4
7 2
0 4
2 6
1 2 40
1 2 70
1 2 90
1 2 120
*/

POJ - 2391 最大流的更多相关文章

  1. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  2. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  3. POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)

    http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...

  4. POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)

    [题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...

  5. POJ 2391.Ombrophobic Bovines (最大流)

    实际上是求最短的避雨时间. 首先将每个点拆成两个,一个连接源点,一个连接汇点,连接源点的点的容量为当前单的奶牛数,连接汇点的点为能容纳的奶牛数. floyd求任意两点互相到达的最短时间,二分最长时间, ...

  6. POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)

    <题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...

  7. POJ 2391 二分+最大流

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19066   Accepted: 4 ...

  8. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  9. POJ 2391 floyd二分+拆点+最大流

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20904   Accepted: 4 ...

随机推荐

  1. python--字符编码理解

    一.字符编码简史: 美国:1963年 ASCII (包含127个字符  占1个字节) 中国:1980年 GB2312 (收录7445个汉字,包括6763个汉字和682个其它符号) 1993年 GB13 ...

  2. Python爬虫系列-BeautifulSoup详解

    安装 pip3 install beautifulsoup4 解析库 解析器 使用方法 优势 劣势 Python标准库 BeautifulSoup(markup,'html,parser') Pyth ...

  3. jenkins+svn+pipeline+kubernetes部署java应用(一)

    一.linux安装svn服务端 yum -y install subversion 二.创建svn版本库(项目仓库) mkdir -p /home/svn svnadmin create /home/ ...

  4. GoF23种设计模式之行为型模式之备忘录模式

    一.概述         在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象的外部保存这个状态.以便以后可以将该对象恢复到原先保存的状态. 二.适用性 1.当需要保存一个对象在某个时刻的状态( ...

  5. python3爬取”理财大视野”中的股票,并分别写入txt、excel和mysql

    需求:爬取“理财大视野”网站的排名.代码.名称.市净率.市盈率等信息,并分别写入txt.excel和mysql 环境:python3.6.5 网站:http://www.dashiyetouzi.co ...

  6. stm32L0系列学习(二)HAL-LL库等比较

  7. Linux学习-核心编译的前处理与核心功能选择

    硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...

  8. Makefile基础(二)

    上一章:C语言之Makefile基础(一) 上一章的Makefile写的中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写的更简洁,同时减少出错的可能 一个目标依赖 ...

  9. Python 实战一

    列表ID的显示 起初ID显示的是数据库中的id,因为数据库中的id是自增长的,所以删除一条后,这里显示就叉开了,这里使用索引的方式来显示. 这个功能实现的逻辑: 第一:定义一个表格的架构,用id=‘i ...

  10. mac 命令行下连接到MySQL mysql: command not found

    mac下刚刚安装完MySQL后使用命令连接到MySQL mysql -uroot -p 提示:  -bash: mysql: command not found使用  /usr/local/mysql ...