[ABC205F] Grid and Tokens 题解
题目大意
给定 \(n\) 个点和一个 \(H\times W\) 的网格,每个点可以放置在 \((A_i,B_i)\) 到 \((C_i,D_i)\) 的矩形中或不放,每一行或一列只能放置一个点,求最多能放多少个点。
思路分析
首先看数据范围,再结合题目给的限制条件,容易发现这是一道网络流。
考虑建图,因为行和列存在限制条件而网格中的点不存在,所以可以考虑将每一行和每一列分别建成一个点。再建立一个超级源点和超级汇点,源点向行连边权为 \(1\) 的边,列向汇点连边权为 \(1\) 的边。 表示每一行和每一列只能放一个点的限制条件。
对于一个点的矩形放置范围,可以转换为行 \(A_i\sim C_i\) 向该点连边权为 \(1\) 的边,该点向列 \(B_i\sim D_i\) 连边权为 \(1\) 的边,表示每一行和每一列对于点的匹配。
同时,点存在容量的限制,所以要将点拆成入点和出点,再连边。
综上所述,建图过程如下:
建立源点,汇点。
对于每一行和每一列建立一个点,源点向行连边权为 \(1\) 的边,列向汇点连边权为 \(1\) 的边。
对于每一个点,建立入点和出点,入点向出点连边权为 \(1\) 的边,行 \(A_i\sim C_i\) 向入点连边权为 \(1\) 的边,出点向列 \(B_i\sim D_i\) 连边权为 \(1\) 的边。

因为流网络是单位网络,所以时间复杂度为 \(O(n^3)\)。(\(n,H,W\) 同阶)
代码
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int N=200100;
#define inf 0x3f3f3f3f
int n,m,k,idx=1,S,T,in1,in2,in3,in4,cnt;
int to[N],nxt[N],head[N],w[N];
int cur[N],d[N];
queue <int> q;
void add(int u,int v,int c){
    idx++;to[idx]=v;nxt[idx]=head[u];head[u]=idx;w[idx]=c;
    idx++;to[idx]=u;nxt[idx]=head[v];head[v]=idx;w[idx]=0;
}
bool bfs(){
    memset(d,-1,sizeof d);
    while(!q.empty()) q.pop();
    cur[S]=head[S];
    q.push(S);d[S]=0;
    while(!q.empty()){
        int now=q.front();q.pop();
        for(int i=head[now];i;i=nxt[i]){
            int v=to[i];
            if(~d[v]||!w[i]) continue;
            d[v]=d[now]+1;
            cur[v]=head[v];
            if(v==T) return 1;
            q.push(v);
        }
    }
    return 0;
}
int dfs(int s,int lim){
    if(s==T) return lim;
    int flow=0;
    for(int i=cur[s];i&&flow<lim;i=nxt[i]){
        int v=to[i];cur[s]=i;
        if(d[v]!=d[s]+1||!w[i]) continue;
        int t=dfs(v,min(w[i],lim-flow));
        if(!t) d[v]=-1;
        w[i]-=t;w[i^1]+=t;flow+=t;
    }
    return flow;
}
int dinic(){
    int ans=0,flow=0;
    while(bfs()) while(flow=dfs(S,inf)) ans+=flow;
    return ans;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    S=N-5;T=N-6;cnt=n+m+1;
    for(int i=1;i<=n;i++) add(S,i,1);//源点->行
    for(int i=n+1;i<=n+m;i++) add(i,T,1);//列->汇点
    for(int i=1;i<=k;i++){
        scanf("%d%d%d%d",&in1,&in2,&in3,&in4);
        for(int i=in1;i<=in3;i++) add(i,cnt,1);//行->入点
        for(int i=n+in2;i<=n+in4;i++) add(cnt+1,i,1);//出点->列
        add(cnt,cnt+1,1);//入点->出点
        cnt+=2;
    }
    cout<<dinic()<<'\n';
    return 0;
}
												
											[ABC205F] Grid and Tokens 题解的更多相关文章
- 算法与数据结构基础 - 贪心(Greedy)
		
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
 - 【题解】AT2043 AND Grid
		
[题解]AT2043 AND Grid 我们考虑直接构造两个互补的图切分别联通的图,然后原图有的大家都有就构造完成了. #include<iostream> #include<cst ...
 - 题解报告:poj 2185  Milking Grid(二维kmp)
		
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
 - ZOJ - 3781 Paint the Grid Reloaded 题解
		
题目大意: 给一个n*m的X O构成的格子,对一个点操作可以使与它相连通的所有一样颜色的格子翻转颜色(X—>O或O—>X),问给定的矩阵最少操作多少次可以全部变成一样的颜色. 思路: 1. ...
 - POJ2185 Milking Grid 题解 KMP算法
		
题目链接:http://poj.org/problem?id=2185 题目大意:求一个二维的字符串矩阵的最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵. 题目分析:next ...
 - Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 题解  最小生成树
		
题目链接:https://codeforces.com/contest/1245/problem/D 题目大意: 平面上有n座城市,第i座城市的坐标是 \(x[i], y[i]\) , 你现在要给n城 ...
 - CF1703E Mirror Grid 题解
		
给定一个矩阵,判断最少将多少个格反转后使得旋转零度,九十度,一百八十度,二百七十度相等. 枚举矩阵每个位置是 \(0\) 还是 \(1\),若已经判断过则跳过,全统 \(1\) 和全统 \(0\) 取 ...
 - LeetCode OJ 题解
		
博客搬至blog.csgrandeur.com,cnblogs不再更新. 新的题解会更新在新博客:http://blog.csgrandeur.com/2014/01/15/LeetCode-OJ-S ...
 - leetcode & lintcode 题解
		
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
 - NBUT1541 Rainwater 题解
		
http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1541 When rain, nocLyt discovered a magical phenomeno ...
 
随机推荐
- 基于GPT搭建私有知识库聊天机器人(一)实现原理
			
1.成品演示 支持微信聊天 支持网页聊天 支持微信语音对话 支持私有知识文件训练,并针对文件提问 步骤1:准备本地文件a.txt,支持pdf.txt.markdown.ppt等 步骤2:上传a.txt ...
 - 一键搞定发布自己Jar到Maven中央仓库
			
做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar包 然后发布到maven中央仓库给别人使用. hhh 我感觉自己写一个jar包工具然后,被很多人使用是一件很牛,很快乐事 ...
 - IIS部署的应用无法自动注册到Nacos
			
问题描述: 自己开发的某系统后台API接入nacos,在IIS上部署无法自动注册到nacos服务列表中.其根本原因是网站处于休眠状态,当某请求访问该网站时,网站被激活,nacos注册成功. 但这块有个 ...
 - ubuntu22.04安装vsftp遇到的问题
			
问题 FileZilla连接文件服务器时出现"无法读取文件目录",随后出现"20秒后无活动,连接超时"."无法连接到服务器"文件目录无法读取 ...
 - 使用docker构建可动态启动的FreeSWITCH实例
			
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Docker版本:23.0.6 使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的 ...
 - 使用npm下载vue
			
一.安装npm 1. 安装node.js npm(Node Package Manager): node.js下的包管理器 前往node.js官网下载并安装工具,nodejs安装完毕后自动会安装npm ...
 - React: 按钮点击时修改颜色
			
背景 当存在多个点击按钮时,需要提示用户点击的哪个按钮,所以要进行颜色的修改 import * as React from 'react'; import './style.css'; export ...
 - python下的jstack - pystack
			
背景 python 多进程任务,卡在某个地方没有继续执行也没有报出异常,进程被hang住 日志没有捕获到相关信息,需要知道进程阻塞在哪里,为什么阻塞 jvm提供了jstack.jmap类工具进行性能分 ...
 - 在Volo.Abp微服务中使用SignalR
			
假设需要通过SignalR发送消息通知,并在前端接收消息通知的功能 创建SignalR服务 在项目中引用 abp add-package Volo.Abp.AspNetCore.SignalR 在Mo ...
 - npm install 下载依赖的过程
			
首先检查.npmrc文件,项目级.npmrc文件>用户级的.npmrc文件>全局性的.npmrc文件>npm内置的.npmrc文件 是否有lock文件 没有lock文件 从npm远程 ...