首页 > 其他分享 >网络流学习记录

网络流学习记录

时间:2024-09-23 16:01:40浏览次数:1  
标签:yi xi yyq 记录 int sum 网络 学习 DIS

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,应该改掉inf
    queue<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;
}

标签:yi,xi,yyq,记录,int,sum,网络,学习,DIS
From: https://www.cnblogs.com/7islands/p/18427131

相关文章

  • 想要转行到互联网行业,是应该选择软件工程还是网络安全?_网络工程和网络空间安全谁更适
    学习路线:这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄......
  • 深度学习经典模型之BERT(下)
    深度学习经典模型之BERT(上)在"深度学习经典模型之BERT(上)"我们描述了BERT基本信息、意义、与GPT和Transformer的区别、预训练、自监督等相关信息后,本章节将介绍BERT的输入、Encoder、微调及两个主流变种。BERTinputs切词方法BERT的切词方法用的是WordPieceembedd......
  • 对比学习
    好的,我们通过一个具体的数字例子来解释c_mi是如何改变顺序的。假设例子假设初始的c_mi是一个形状为(4\times3)的张量(即有4行,3列),值如下:[c_mi=\begin{bmatrix}1&2&3\4&5&6\7&8&9\10&11&12\end{bmatrix}]这个矩阵表示上下文嵌入c,每一......
  • 学网络安全真的难吗?能找到工作吗?
    网络安全是当下非常热门的行业,更是一个新兴行业。相对于其他IT行业而言,网络安全拥有非常不错的就业前景,岗位也多样化,更重要的是它在企业当中拥有较高的地位,薪资待遇也普遍较高。那么学网络安全参加培训难吗?好找工作吗?我们一起来看看吧。学网络安全参加培训难吗?这个......
  • 学习HTMLCSS第六天
    CSS核心属性详解在前端开发中,CSS(层叠样式表)起着至关重要的作用,它可以让网页变得更加美观和易用。本文将详细介绍CSS中的一些核心属性,包括行高、圆角、透明度、颜色值、浮动、定位和子绝父相等。一、行高(line-height)概念:行高是指文本行与行之间的间距,实际上是每行文本......
  • 开源网安网络安全培训视频入选工信部人才教育服务平台
    开源网安“数据安全”“防范恶意软件”“防范钓鱼邮件”“保护个人信息安全”4大网络安全培训视频通过层层筛选,成功入选工信部人才教育服务平台。开源网安网络安全培训视频的入选,推动工信部增强了网络安全专业知识普及和宣传力度,提升全民网络安全意识和技能,丰富了2024年国家网络安......
  • 小白学网络安全要求学历吗?
    众所周知,从事IT行业学历的作用是不可忽视的,它是一块敲门砖,更是我们进入职场的起点,起到了重要的作用。而网络安全作为当下热门的职业领域,它的火爆程度是有目共睹的,那么学网络安全有学历要求吗?这是很多人关心的问题,我们来看看吧。学习网络安全对学历没有固定的要求,任何学历......
  • Nat Med.作者提供全文的绘图代码,对于学习作图很有帮助
    本期教程获得本期教程全文代码:在订阅号后台回复关键词:202409232022年教程总汇2023年教程总汇引言今天分享的文章是2024发表在NatMed.期刊中,来自上海交通大学医学院的文章,作者提供了全文的绘图代码,确实勇,对于学习绘图提供充分的素材。也是一个学习作图具重大意义......
  • 如何开启项目管理学习之旅?免费助你建立系统知识体系
    活动介绍新时代新挑战,传统公司的结构、传统的企业管理方式、增长策略与决策面对常态化的不确定性时备受挑战。项目经济时代,面对内外部环境的快速变化,企业、组织、个人要如何从容应对?在当下竞争日益激烈的市场环境中,企业需要不断提升自身管理能力来应对各种挑战,而通过内训系统地学习......
  • 苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,
    年份2024    基础:Javase  Javaweb已完结   2024  8.25---9.14  20天Day-01   8.25今天开始学习已经晚了,网盘下载了一下文件,做了一些开始项目的准备工作。本来其实打算用notepad++来写学习日志的,但是那个传不了图片,而且编辑视图没有这......