poj2391Ombrophobic Bovines(floyd+二分+拆点+最大流)

这是一篇关于如何利用Floyd算法、二分查找和最大流方法解决牛避雨问题的博客。题目要求在最短时间内使所有牛都能到达雨棚,通过构建有向图并进行拆点操作,确保牛的路径不可逆,最终通过二分搜索确定最短时间。文章包含详细的数据范围和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目请戳这里

题目大意:n块草地,每块草地有一些牛,每块草地有雨棚,可以容纳一定量的牛。草地间有路,可以无限通过牛,牛通过某条路有一定的时间。现在求最短的时间让所有的牛都能到雨棚。

题目分析:最大流。题目给的是无向图,所以先跑一遍floyd,求出任意2块草地之间最少的时间。因为牛通过路的时间是累加的,所以要把无向图改成有向图,保证牛走某条路后时间是累加的。方法是拆点,将草地i拆成i和i+n,2个点,源点到每个i建边,边权为草地i初始的牛的数量。每个i+n到汇点建边,边权为第i个草地能容纳的牛的数量。如果i到j有路,那么i和j+n连边,这样保证牛经过i到j的最短路后,不能返回,只能到达汇点,从而实现对牛的路径的控制。要求最短的时间,那么二分时间,每次求一次最大流,流量等于牛的总数才合法。

本题数据范围比较大,要__int64。

详情请见代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 405;
const int M = 160005;
typedef __int64 ll;
const ll inf = ((ll)1<<38);

ll dist[N][N];
int head[N],dis[N],sta[N],que[N],cnt[N],rpath[N];
int cow[205],stay[205];
struct node
{
    int to,c,next,pre;
}arc[M];
int n,m,num,sum;
void build(int s,int e,int cap)
{
    arc[num].to = e;
    arc[num].c = ca
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值