首页 > 其他分享 >【LSOIT3】天气之子 ---题解

【LSOIT3】天气之子 ---题解

时间:2023-08-14 10:11:43浏览次数:47  
标签:每个 LSOIT3 int 题解 超能力 --- 建图 res

【LSOIT3】天气之子 ---题解

题目传送门

【我叫阳菜。请多关照,帆高。】

【她一直不断的祈祷着,一边不断地穿过那个鸟居。】

【我做了个梦,初见你时,就像是迷途的小猫一样。】

【而你却帮我找到了存在的意义。】

【呐,马上要开始放晴了哦。】


这个题其他做法不知道怎么搞,暴力的话也不知道能过几个点,但是其实比较明显,仔细想可以想到是网络流,因为阳菜只会每次在一个区域,并且在那个区域不一定会使用超能力,用的话也只会用一次。所以我们得到了建图的方法。

  • 超级源点向每个区域连边,因为只会去一次,所以容量为1。
  • 每个区域向其所在的人连一条容量为1的边,因为只会帮一个人。
  • 每个人向每个区域使用的超能力连一条边,容量为1,理由同上。

然后跑最大流??

一开始我也是这样想的,可惜怎样都只有70分,但是,这是为什么。

如果建图没有问题的话,难道是我最大流跑错了??

等等!“建图没问题”

建图真的没问题吗?

每个区域向其所在的人连一条容量为1的边,因为只会帮一个人。
每个人向每个区域使用的超能力连一条边,容量为1,理由同上。

但是,这样就无法保证每个人只有1次!所以要保证每个人至多帮了一次,我们需要,拆点---

将点拆成入点和出点!

入点再向出点连一条容量为1的边,这样就能保证每个人最多帮一次了。

割掉这条边也相当于不帮这个人。

最后就是代码了,注意每个区域和人和超能力的编号不要写错。

#include<bits/stdc++.h>
#define int long long 

using namespace std;

const int N=20010;
const int INF=1e15;

int n,p,q,S,T;
bool pd1[110][110],pd2[N][N];
int d[N<<2],now[N<<2];

struct liststar
{
    int u,v,w,nxt;
}e[N<<2];
int cnt=1,head[N<<2];
void add(int u,int v,int w){e[++cnt].nxt=head[u];head[u]=cnt;e[cnt].v=v;e[cnt].w=w;}
void addd(int u,int v,int w){add(u,v,w);add(v,u,0);}

int read()
{
    int x=0,s=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')s=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-48;
    return x*s;
}

void init()
{
    n=read();p=read();q=read();S=0;T=80001;//T设大一点以防中间有点过来
    for(int i=1;i<=p;i++)addd(S,i,1);
    for(int i=1;i<=n;i++)addd(p+q+i,p+q+i+n,1);//拆点
    for(int i=1;i<=n;i++)
        for(int l=1;l<=p;l++)
        {
            bool pd=read();
            if(pd)addd(l,p+q+i,1);
        }
    for(int i=1;i<=n;i++)
        for(int l=1;l<=q;l++)
        {
            bool pd=read();
            if(pd)addd(p+q+i+n,p+l,1);
        }
    for(int i=1;i<=q;i++)addd(p+i,T,1);
}

bool bfs()
{
    queue<int>q;
    memset(d,0,sizeof(d));
    d[S]=1;now[S]=head[S];
    q.emplace(S);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u],y;i;i=e[i].nxt)
            if(e[i].w && !d[y=e[i].v])
            {
                now[y]=i;
                d[y]=d[u]+1;
                q.emplace(y);
                if(y==T)return true;
            }
    }
    return false;
}

int dinic(int x,int flow)
{
    if(x==T)return flow;
    int res=flow;
    for(int i=head[x],y;i;i=e[i].nxt)
    {
        now[x]=i;
        if(e[i].w && d[y=e[i].v]==d[x]+1)
        {
            int t=dinic(y,min(e[i].w,res));
            if(!t)d[y]=0;
            res-=t;e[i].w-=t;e[i^1].w+=t;
        }
    }
    return flow-res;
}

signed main()
{
    init();
    int res=0,maxn=0;
    while(bfs())while(res=dinic(S,INF))maxn+=res;//dinic板子
    cout<<maxn;
    return 0;
}

标签:每个,LSOIT3,int,题解,超能力,---,建图,res
From: https://www.cnblogs.com/LZMkingNB/p/17627883.html

相关文章

  • 上周热点回顾(8.7-8.13)
    热点随笔:· 耗时6个月,我们做了一款干净、免费、开源的AI数据库管理工具 (敖丙)· 你们眼睛干涩,胀痛吗?C#WPF久坐提醒桌面小程序-内附眼肌运动、远视力表高清图 (VipSoft)· 二代水务系统架构设计分享——DDD+个性化 (天行健君子以自强)· 都是程序员,来认识一下啊! (XD......
  • vite 找不到依赖模块:[plugin:vite:dep-pre-bundle]
    问题描述:运行项目时,出现[plugin:vite:dep-pre-bundle]错误。这种问题一般为依赖的包未正常配置相关字段,导致vite无法找到包的入口。遇到这种模块内、找不到引用模块的,都可以用路径别名来解决解决办法://vite.config.jsalias:[{find:'fs',replacement:'node_modules/......
  • nvm - windows的安装和使用
    nvm-介绍node版本管理器,也就是说:一个nvm可以管理多个node版本(包含npm与npx),可以方便快捷的安装、切换不同版本的node。nvm-windows就是nvm的windows版本。https://github.com/nvm-sh/nvmnvm和node默认安装目录C:\Users\oujr\AppData\Roaming\nvm这个要改......
  • 3-硬件以及软件初探
    目录一.开发板简介二.软件Keil简介一.开发板简介1.最小系统电路(内核,存储器,时钟,复位,电源管理).广泛意义上应该是:单片机,晶振电路,复位电路.2.芯片启动方式二.软件Keil简介1.软件安装见链接2.工程结构......
  • Nexpose v6.6.210 for Linux & Windows - 漏洞扫描
    Nexposev6.6.210forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseAug09,2023请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随......
  • Palo Alto Cortex XSOAR 6.11 (Linux) - 安全编排、自动化和响应 (SOAR) 平台
    PaloAltoCortexXSOAR6.11(Linux)-安全编排、自动化和响应(SOAR)平台SecurityOrchestration,AutomationandResponse(SOAR)platform请访问原文链接:https://sysin.org/blog/cortex-xsoar-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org重新定义安全......
  • UTM v4.3.5 - 在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS
    UTMv4.3.5-在macOS上优雅的使用QEMU虚拟化Windows、Linux和macOS在iOS中虚拟化Windows、Linux和Unix请访问原文链接:https://sysin.org/blog/utm-4/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgUTM4底层基于QEMU,在Mac上安全的运行Windows、Li......
  • 洛谷P9533 区间翻转区间异或和 题解
    原题:洛谷P9533一道性质题不难发现,区间翻转操作是没有用的(虽然比赛的时候想了好久www)首先,区间翻转要想对答案有贡献,一定是下边这种情况:三个连续的区间:\(A~|~B~|~C\)满足:\(B\oplusC=0,A\oplusC=0\)。将\(B∪C\)这个灵异区间进行翻转,使\(A\)和\(C\)合并到一起,会增加一......
  • CSS基础-文字样式
    文字样式文字是网页展示的重要内容之一,所以对文字的修饰也是CSS重点关注的一部分,CSS提供了以下常用的样式属性来修饰文字。color属性color用来设置文字颜色。设置方式支持以下几种格式英语颜色单词形式,如:red(红)、black(黑)、orange(橙色)等。<style> .box{ color:red......
  • CaltechCS122 笔记:Assignment 1: NanoDB Set-Up and Storage Layer
    Assignment1:NanoDBSet-UpandStorageLayerNanoDB是加州理工大学CaltechCS122课程使用的教学数据库系统bufferpoolmanagerlab1的第二部分是实现充分利用空间的bpm,当前所给出的bpm代码pin/unpin的调用存在问题,当进行大规模数据的insert操作时,会出现空间不够......