USACO Section 4.2 Drainage Ditches(最大流)

最大流问题。ISAP算法。注意可能会有重边,不过我用的数据结构支持重边。距离d我直接初始化为0,也可以用BFS逆向找一次。

-----------------------------------------------------------------------

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define rep(i,l,r) for(int i=l;i<r;i++)
#define dow(i,l,r) for(int i=l;i>r;i--)
#define clr(x,c) memset(x,c,sizeof(x))
using namespace std;
const int inf=0x3f3f3f3f,maxn=200+5;
struct edge {
    int from,to,cap,flow;
};
struct ISAP {
    int n,m,s,t;
    vector<edge> edges;
    vector<int> g[maxn];
    int d[maxn];
    int cur[maxn];
    int p[maxn];
    int num[maxn];
    void init(int n) {
        this->n=n;
        rep(i,0,n) g[i].clear();
        edges.clear();
    }
    void addEdge(int from,int to,int cap) {
        edges.push_back((edge){from,to,cap,0});
        edges.push_back((edge){to,from,0,0});
        m=edges.size();
        g[from].push_back(m-2);
        g[to].push_back(m-1);
    }
    int augment() {
        int x=t,a=inf;
        while(x!=s) {
            edge& e=edges[p[x]];
            a=min(a,e.cap-e.flow);
            x=edges[p[x]].from;
        }
        x=t;
        while(x!=s) {
            edges[p[x]].flow+=a;
            edges[p[x]^1].flow-=a;
            x=edges[p[x]].from;
        }
        return a;
    }
    int maxFlow(int s,int t) {
        this->s=s; this->t=t;
        int flow=0;
        clr(d,0);
        clr(num,0);
        rep(i,0,n) num[d[i]]++;
        int x=s;
        clr(cur,0);
        while(d[s]<n) {
            if(x==t) {
                flow+=augment();
                x=s;
            }
            int ok=0;
            rep(i,cur[x],g[x].size()) {
                edge& e=edges[g[x][i]];
                if(e.cap>e.flow && d[x]==d[e.to]+1) {
                    ok=1;
                    p[e.to]=g[x][i];
                    cur[x]=i;
                    x=e.to;
                    break;
                }
            }
            if(!ok) {
                int m=n-1;
                rep(i,0,g[x].size()) {
                    edge& e=edges[g[x][i]];
                    if(e.cap>e.flow) m=min(m,d[e.to]);
                }
                if(--num[d[x]]==0) break;
                num[d[x]=m+1]++;
                cur[x]=0;
                if(x!=s) x=edges[p[x]].from;
            }
        }
        return flow;
    }
} isap;
int s() {
    int n,m;
    cin>>m>>n;
    isap.init(n);
    rep(i,0,m) {
        int from,to,cap,pd=1;
        scanf("%d%d%d",&from,&to,&cap);
        isap.addEdge(from-1,to-1,cap);
    }
    return isap.maxFlow(0,n-1);
}
int main() {
    freopen("ditch.in","r",stdin);
    freopen("ditch.out","w",stdout);
    cout<<s()<<endl;
    return 0;
}

----------------------------------------------------------------------- 

Drainage Ditches
Hal Burch

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch.

Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. Note however, that there can be more than one ditch between two intersections.

Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.

PROGRAM NAME: ditch

INPUT FORMAT

Line 1:Two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream.
Line 2..N+1:Each of N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.

SAMPLE INPUT (file ditch.in)

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

OUTPUT FORMAT

One line with a single integer, the maximum rate at which water may emptied from the pond.

SAMPLE OUTPUT (file ditch.out)

50

转载于:https://www.cnblogs.com/JSZX11556/p/4295472.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chipsel语言_用VHDL语言对FPGA和CPLD器件进行开发时应注意的事项

第25卷第4期苏 州 大 学 学 报(工 科 版)Vol.25No.4 2005年8月JOURNA L OF SOOCH OW UNIVERSIT Y(ENGINEERING SCIENCE E DITION)Aug.2005文章编号:1673-047X(2005)04-0031-02用VHDL语言对FPGA和CPLD器件进行开发时应注意的事项Ξ刘文杰(苏州大学机电工程学院,江苏苏州2…

乐高收割机器人_学习乐高机器人编程,孩子到底收获了什么?

孩子是每个家庭的希望&#xff0c;教育影响着孩子的未来。面对各种辅导班兴趣班&#xff0c;家长们一定会感觉到眼花缭乱。相信对于每一位家长来说&#xff0c;报课外班最关心的问题就是在孩子到底在这里可以收获什么&#xff1f;今天小贝来告诉您&#xff0c;在“贝尔机器人活…

android手机定位p适配,Android 9(P)版本适配指南

一、针对所有应用的行为变更隐私权变更1、后台对传感器的访问受限Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行&#xff0c;系统将对您的应用采取以下限制&#xff1a;您的应用不能访问麦克风或摄像头。使用连续报告模…

gtb分类器参数调节_集成学习

About个人同时在简书和自制个人博客两个地方同时更新文章&#xff0c;有兴趣的话可以来我的博客玩呀&#xff0c;一般而言排版会好不少。本篇在博客的位置。集成学习一句话版本集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生新的学习器。在学习这一章节中&…

android自定义view的实现方法,Android自定义View的实现方法

一些接触Android不久的朋友对自定义View都有一丝畏惧感&#xff0c;总感觉这是一个比较高级的技术&#xff0c;但其实自定义View并不复杂&#xff0c;有时候只需要简单几行代码就可以完成了。如果说要按类型来划分的话&#xff0c;自定义View的实现方式大概可以分为三种&#x…

【网络】c++ socket 学习笔记(一)

首先&#xff0c;我也是新手&#xff0c;一边学一边写 先说一下什么是套接字呢&#xff08;socket&#xff09; 可以自己去翻书 或者上百度百科 百度百科 那么C是怎么声明套接字的呢 在声明之前要加入头文件 #include <winsock2.h> #progma comment(lib, "ws2_32…

rocketmq删除topic_RocketMq 快速入门教程

今年是不平凡的一年&#xff0c;对于每个个体都是。不论我们在哪儿&#xff0c;经历了什么&#xff0c;向前走总没错。虽然方向也很重要&#xff0c;但是不要在一个地方停太久&#xff0c;You young编者荐语&#xff1a;RocketMQ 逐渐成为最主流的消息队列&#xff0c;学习 Roc…

android京东首页轮播代码,仿京东商品详情轮播图

好久没有更新啦,今天来搞一个京东的轮播:直接上效果8月-16-2016 09-38-10.gif8月-16-2016 09-37-17.gif如果想真实体验可以去京东APP体验一下.描述一下效果,向左滑动时,右边的图片从底下出来 而且是一半的位置同理向右滑动也是 .那么怎么实现呢先搞一个collectionview 做一个不…

对数据库连接池的理解

对数据库连接池的理解&#xff1a; java操作数据库需要使用JDBC来进行操作&#xff0c;每次操作需要获取和数据库的一个连接&#xff0c;并在连接中进行操作。但是&#xff0c;频繁的打开链接&#xff0c;关闭连接势必对系统性能造成消耗。所以&#xff0c;把获取连接与对连接的…

群晖如何建php网站_群晖建博客详细教程

群晖NAS功能强大&#xff0c;除了大家都知道的存储文件&#xff0c;代替各种公有云以外&#xff0c;还可以当成一个网站服务器来使用。配合DDNS和国际域名&#xff0c;可以实现与在网上购买的专业虚拟主机一样的功能&#xff0c;甚至更强大&#xff0c;因为空间无限大&#xff…

android 触摸防抖,一种触摸屏防抖优化方法、系统及触摸屏终端与流程

本发明涉及触摸屏技术领域&#xff0c;尤其涉及一种触摸屏防抖优化方法、系统及触摸屏终端。背景技术&#xff1a;随着电子信息产业的快速发展&#xff0c;触摸屏作为具有人机交互功能的智能产品&#xff0c;应用面极为广泛&#xff0c;但其存在着较多的触摸抖动问题。现有的去…

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 基于数据库资源的多语言实现...

以前的开发平台里&#xff0c;是用xml语言包实现了多语言功能&#xff0c;现在新的平台里进行了调整&#xff0c;把多语言包资源放在数据库表里实现了。 我们系统预留了多语言的配置全局变量、可以通过配置这个参数达到切换多语言的目的 我们在选项管理里增加一个多语言选择的选…

手机投屏不是全屏怎么办_手机投屏怎么满屏

手机投屏是很多小伙伴们都喜欢玩的&#xff0c;不少小伙伴们小伙伴们在使用手机投屏的时候发现不能满屏&#xff0c;想要知道方法的小伙伴们&#xff0c;就让小编给大家详细的讲讲满屏方法吧。手机投屏怎么满屏1、手机具有投屏的功能。目前大多数手机都已经具备发无线投屏的功能…

android开发ui插件下载,TKUISDK-ANDROID

更新记录4.3.4(2021-04-29)1、修改请求权限在进入教室后 需删除之前版本的请求权限代码,并添加 权限请求回调代码 详见文档进入教室 2.4.1.12 新增旁听生身份3 新增大班课红包功能4 修复已知bug4.3.0(2021-04-01)1、一对一教室pad端“视频居左/居右”可拖拽改变课件区、视频区比…

C语言第一节 C语言程序与开发工具

开发工具的选择 可以用来写代码的工具&#xff1a;记事本、UltraEdit、Vim、Xcode等 选择Xcode的原因&#xff1a;苹果官方提供的开发利器、简化开发过程、有高亮显示功能 使用Xcode新建一个C程序的源代码文件&#xff08;拓展名为.c或者.C&#xff09; 打开Xcode 新建文件 选择…

android 关机闹钟 实现,安卓关机闹钟:你所不知道的关机闹钟的背后

可以通过其他方式实现关机闹钟事实上大家也大可不必抱怨Android手机或者是iPhone的固执做法&#xff0c;因为目前在Android手机当中&#xff0c;全新的“明”系列摩托罗拉A1680就已经支持关机闹钟了&#xff0c;这就更加说明了该功能和系统无关。而苹果iPhone也可以通过一些非常…

flux读取不到数据_初学flux的疑问?无法添加数据到DOM

我初学flux,照着网上的代码&#xff0c;尝试学习写了一个简单的添加数据表页面&#xff0c;如图&#xff1a;我想实现的功能是在下方表单填写数据之后点击提交可以实时的在上方表格添加一条数据&#xff0c;现在碰到的问题是我点击提交毫无反应也没有报错。我的架构是这个样子的…

列表视图

列表视图 分类&#xff1a; SharePoint入门2014-10-14 00:10 298人阅读 评论(0) 收藏 举报SharePointlist view使用View&#xff0c;可以按照特定的要求和条件展示List/Library里面的条目。View可以做一下设定来显示数据&#xff1a; 1. 显示哪些属性(column) 2. 属性…

android 线程 界面,android开发教程之子线程中更新界面

每个Handler对象与创建它的线程相关联&#xff0c;并且每个Handler对象只能与一个线程相关联。Handler一般有两种用途&#xff1a;1)执行计划任务&#xff0c;你可以再预定的实现执行某些任务&#xff0c;可以模拟定时器。2)线程间通信。在Android的应用启动时&#xff0c;会创…