网络流学习记录

news/2024/11/17 4:53:49/文章来源:https://www.cnblogs.com/7islands/p/18427131

CCPC网络赛 G

Problem G. 疯狂星期六

Input file: standard input    Output file: standard output
Time limit: 1 second      Memory limit: 256 megabytes
yyq 和他的朋友们一共 n 个人(编号为 1 到 n ,yyq 编号为 1)去某饭店吃疯狂星期六。第 i 个人初始手中有 ai 元的零花钱,即每个人的总花费不能超过 ai 元。由于每个人到饭店的路程不同,所以第 i 个人打车去的花费为 Vi 元。yyq 和他的朋友们一共点了 m 件菜品。其中,第 i 件菜品价值 Wi 元,由第 xi 个人和第 yi 个人吃。结账的时候,xi 和 yi 可以自行决定他们俩谁付多少钱(要求每个人在这道菜中付的钱为非负整数,且 xi和 yi 付款的和必须为 Wi 元)。由于今天是 yyq 的生日,所以 yyq 想让自己的总花费(打车费与菜品费之和)最多,即严格大于其他每个人的总花费。
请问在每个人不超额花费的前提下, yyq 的愿望能实现吗?
注意 xi 和 yi 可能相等,即一个人独吃这道菜,这个人独自付该菜品费用。

Input

第一行,两个整数 n, m(2 ≤ n ≤ 103,1 ≤ m ≤ 103),分别表示人数和菜品数量。
接下来 n 行,每行 2 个整数 ai, Vi(1 ≤ Vi ≤ ai ≤ 106),分别表示这 n 个人的零花钱数和打车费用。
接下来 m 行,每行 3 个整数 xi, yi, Wi(1 ≤ xi, yi ≤ n ,1 ≤ Wi ≤ 106),表示这 m 件菜品的信息:第i 件菜品价值 Wi 元,由 xi 和 yi 食用并付款。(注意 xi 和 yi 可能相等)

Output

共一行。若 yyq 能实现愿望,输出 YES,否则输出 NO。

首先算出yyq能花费的最大金额,即 所有yyq吃的菜的价值总和加上yyq打车费用 和 yyq的零花钱 的最小值.

样例1建图
3 3
10 5
6 5
15 1
1 2 3
1 3 1
2 3 2

样例2建图

2 1
1 1
1 1
1 2 1

代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=0x3f3f3f3f3f3f3f3f;
const ll infll=0x3f3f3f3f3f3f3f3f;
#define int long long
#define pii pair <int,int>
#define ld long double
#define endl "\n"
const int N=200050;int a[N],v[N];
int x[N],y[N];
int wei[N];struct EDGE_{int to,w,nxt;
}E_[N];
int HEAD_[N],cnt;
//链式前向星存图:HEAD[i]是i最后出现的位置,nxt是这个点为出点的上一个位置。void INIT(int n){for (int i=0;i<=n;i++)HEAD_[i]=-1;cnt=0;
}void ADD1(int u,int v,int w){E_[cnt].nxt=HEAD_[u];E_[cnt].to=v;E_[cnt].w=w;HEAD_[u]=cnt++;
}void ADD(int u,int v,int w){ADD1(u,v,w);ADD1(v,u,0);
}int S_,T_;
int NOW[N],DIS[N];
int BFS_(){memset(DIS, 0x3f,sizeof DIS);//<-注意数据范围:如果需要开ll,应该改掉infqueue<int> q;q.push(S_);DIS[S_]=0;NOW[S_]=HEAD_[S_];while (!q.empty()){int u=q.front();q.pop();for (int i=HEAD_[u];i!=-1;i=E_[i].nxt){int v=E_[i].to;if(E_[i].w>0&&DIS[v]==inf){q.push(v);NOW[v]=HEAD_[v];DIS[v]=DIS[u]+1;if(v==T_)return 1;}}}return 0;
}
int DFS_(int u,int sum){if(u==T_)return sum;int k,res=0;for (int i=NOW[u];(i!=-1)&&sum;i=E_[i].nxt){NOW[u]=i;int v=E_[i].to;if(E_[i].w>0&&(DIS[v]==DIS[u]+1)){k=DFS_(v,min(sum,E_[i].w));if(k==0)DIS[v]=inf;E_[i].w-=k;E_[i^1].w+=k;res+=k;sum-=k;}}return res;
}
int Dinic(){int res=0;while (BFS_()){//    cerr <<1<<endl;res+=DFS_(S_,inf);}return res;//最坏时间复杂度:O(V^2·E)//单位容量(w=1)网络时间复杂度:O(E·min((E^(1/2),V^(2/3))
}
//注意要调用INIT函数
//注意数据范围能不能memset(BFS_)signed main (){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;cin >>n>>m;for (int i=1;i<=n;i++){cin >>a[i]>>v[i];}int sum=0;int sumy=0;for (int i=1;i<=m;i++){int u,v,w;cin >>u>>v>>w;x[i]=u,y[i]=v,wei[i]=w;sum+=w;if (u==1||v==1)sumy+=w;}int mx=min(sumy+v[1],a[1]);a[1]=mx;for (int i=2;i<=n;i++){a[i]=min(a[i],mx-1);}for (int i=1;i<=n;i++){a[i]-=v[i];if (a[i]<0){cout <<"NO"<<endl;exit(0);}}INIT (m+n+2);S_=m+n+1,T_=m+n+2;for (int i=1;i<=m;i++){ADD(S_,i,wei[i]);}for (int i=1;i<=m;i++){if (x[i]==y[i])ADD(i,m+x[i],wei[i]);else{ADD(i,m+x[i],wei[i]);ADD(i,m+y[i],wei[i]);}}for (int i=1;i<=n;i++){ADD(i+m,T_,a[i]);}if (Dinic()==sum)cout <<"YES"<<endl;else cout <<"NO"<<endl;
}

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

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

相关文章

PARTIII-Oracle事务管理-事务

10. 事务 10.1. 事务简介 事务是包含一个或多个SQL语句的逻辑、原子工作单元。事务将SQL语句分组,使它们要么全部提交,这意味着它们被应用到数据库中,要么全部回滚,这意味着它们从数据库中被撤销。Oracle数据库为每个事务分配一个唯一的标识符,称为事务ID。 所有Oracle事务…

BPM(业务流程管理)的最佳开源工具

探索最佳开源工具如何优化不同行业的业务流程管理(BPM)场景。在上个月的文章中,我们探讨了 BPM 并总结了构建 BPM 应用程序的三大步骤。 什么是BPM,如何构建一个BPM App? - NocoBase 然而,在各行各业中,BPM 面临着各自独特的挑战。在教育领域,优化招生管理流程和提升学…

谷歌发布新 RL 方法,性能提升巨大;苹果前设计总监正与 OpenAI 合作开发 AI 设备丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的会议」,但内容仅代表编辑的…

文件上传日志包含详解与CTF实战

1. 日志简介 1.1 日志介绍 日志是记录系统或应用程序运行时事件的文件。这些记录可以包括错误信息、用户活动、系统性能指标等,帮助开发者和管理员监控和排查问题。 日志通常会记录多种内容,包括:时间戳:事件发生的具体时间。 用户代理(UA)头:浏览器或客户端的类型和版本…

一位架构师的自述:在尚未踏入的世界成为你自己

这是我参与创作者计划的第1篇文章我叫艾佳,工作经验14年,编程经验30年。 我来自智能平台部,负责标签平台、标签圈人、标签选品、EasyData、算法数据流的架构工作。 致力于批量计算、流式计算、交互式计算的通用化数据应用构建,降低大数据计算的使用门槛。 在此,我跟大家分…

数据结构 - 概述及其术语

数据结构是数据管理和存储的格式,包含物理结构、逻辑结构和数据运算三要素。物理结构关注数据如何存储,逻辑结构关注数据如何组织,数据运算关注数据处理。将深入学习九类数据结构。经过上一章节《数据结构与算法之间有何关系?》的阐述,相信大家对数据结构多少有了点了解,…

DM(达梦数据库基本操作)

1、创建用户 XTF 密码为 XTF123321 SQL> CREATE USER XTF IDENTIFIED BY "XTF123321";2、权限 (1)--给用户建表权限 SQL> GRANT CREATE TABLE to XTF;总共1个语句正依次执行...[执行语句1]: GRANT CREATE TABLE to XTF; 执行成功, 执行耗时7毫秒. 执行号:10322…

PWA入门:手把手教你制作一个PWA应用

根目录创建 manifest.json{"name": "我是pwa","short_name": "pwa是我","start_url": "/", //启动页面,如果首页是https://www.abc.com/,则直接用“/”即可"display": "standalone","ba…

南沙C++信奥老师解一本通题 1281:最长上升子序列

​【题目描述】一个数的序列bibi,当b1<b2<...<bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN),我们可以得到一些上升的子序列(ai1,ai2,...,aiK),这里1≤i1<i2<...<iK≤N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如…

css使用@media响应式适配各种屏幕的方法示例

定义和使用 使用 @media 查询,你可以针对不同的媒体类型定义不同的样式。 @media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的。 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。 PC端设备…

多智能体协同控制(1)

引言 多智能体系统协同控制算法起源于计算机领域关于分布式计算的研究,后由于数学家们的强势加盟,控制领域的研究一度占领高地。随着人工智能的发展,以多智能体强化学习为代表作的计算机领域专家又重回巅峰。 目前,每年多智能体相关的论文的都浩如烟海,成就了一批手持屠龙…

Axure原型设计:多层级动态表格

多层级表格又成为树形表格,是在后台常用的一种表格形式,当表格数据存在多层级关系是,可以通过多层级表格,从而更加清晰的呈现数据内容,帮助人们更好地理解和分析数据之间的关系,从而更加有效地传递信息。 所以今天作者就教大家怎么在Axure里制作多层级动态表格,包括展开…