CH6802 車的放置

6802 車的放置 0x60「图论」例题

描述

给定一个N行M列的棋盘,已知某些格子禁止放置。问棋盘上最多能放多少个不能互相攻击的車。車放在格子里,攻击范围与中国象棋的“車”一致。N,M≤200。

输入格式

第一行为n,m,t(表示有t个禁止的格子)

第二行到t+1行为x,y,分别表示禁止格子所在的位置,x为第x行,y为第y列,行列编号从1开始。

输出格式

一个整数,表示最多能放多少个車。

样例输入

8 8 0

样例输出

8

题解

把行、列看成节点
1要素:行节点、列节点只能放一个
0要素:行节点之间没有边,列节点之间也没有
所以建二分图跑最大匹配,时间复杂度\(O((n+m)nm)\)

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;rg char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
    for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
    return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;

co int N=201;
int n,m,t,ans,fa[N];
bool a[N][N],v[N];
bool dfs(int x){
    for(int y=1;y<=m;++y){
        if(a[x][y]||v[y]) continue;
        v[y]=1;
        if(!fa[y]||dfs(fa[y])){
            fa[y]=x;
            return 1;
        }
    }
    return 0;
}
int main(){
    read(n),read(m),read(t);
    while(t--) a[read<int>()][read<int>()]=1;
    for(int i=1;i<=n;++i){
        memset(v,0,sizeof v);
        ans+=dfs(i);
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/autoint/p/10971406.html

时间: 2024-11-04 08:17:52

CH6802 車的放置的相关文章

CH6802车的放置(二分图最大匹配)

题    目    传    送    门    在    这 题目大意 题目都很简短了就不说了--(懒得打) 解题思路 我们把行和列都看作节点,对于每个可以放位置,连一条行到列的边. 我们发现这是一个二分图. 因为车不能互相攻击,对于第一行,只能放一个车,对于每一列也是如此,所以每个节点只有一条连边. 那么就符合二分图匹配中每两条边没有公共节点. 本题就变成求二分图最大匹配的题目. 代码如下: #include <iostream> #include <cstdio> #incl

bzoj4807 車

题目大意: Description 众所周知,車是中国象棋中最厉害的一子之一,它能吃到同一行或同一列中的其他棋子.車跟車显然不能在一起打 起来,于是rly一天又借来了许多许多的車在棋盘上摆了起来--他想知道,在N×M的矩形方格中摆最多个数的車 使其互不吃到的情况下方案数有几种.但是,由于上次摆炮摆得实在太累,他为了偷懒,打算增加一个条件:对于 任何一个車A,如果有其他一个車B在它的上面(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B) . 棋子都是相同的. Input 一行,两个

javascript代码放置位置对程序的影响

在编写html文档时,javascript可以放置的位置有两个地方<head>或者<body>,但是放置的地方,会对 JavaScript 代码的正常执行会有一定影响.由于 HTML 文档是由浏览器从上到下依次载入的,javascript的放置位置主要影响获取网页元素.如果你的代码中包含获取网页元素的代码例如document.getElementById(),那么你需要确保你的javascript代码要在你想要获取的元素的位置之后.如过在你想要获取的元素的位置之前调用这个些代码,由

014_HDFS存储架构、架构可靠性分析、副本放置策略、各组件之间的关系

1.HDFS存储架构 (1)HDFS 架构 —— 文件 1)文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)2)NameNode 是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等3)DataNode 在本地文件系统存储文件块数据,以及块数据的校验和.4)可以创建.删除.移动或重命名文件,当文件创建.写入和关闭之后不能修改文件内容. (2)

用css实现一个空心圆,并始终放置在浏览器窗口左下角

用css实现一个空心圆,并始终放置在浏览器窗口左下角         div{                 position:fixed;                 bottom:0;                 left:0;                 width:100px;                 height:100px;                 border:2px solid #000;                 border-radius:

Droppable(放置)组件

.加载方式 //class 加载方式 <div id="dd" class="easyui-droppable" data-options="accept:'#box,#pox'" style="background:black;width:600px;height:400px;"> </div> //JS 加载调用 $('#box').droppable({ accept:'#box,#pox', }

HDFS副本放置策略及机架感知

副本放置策略 副本放置策略的基本思想是: 第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node). 第二个副本放置在与第一个节点不同的机架中的node中(随机选择). 第三个副本和第二个在同一个机架,随机放在不同的node中. 如果还有更多的副本就随机放在集群的node里. Hadoop的副本放置策略在可靠性(block在不同的机架)和带宽(一个管道只需要穿越一个网络节点)中做了一个

Uva 11134 Fabled Rooks (问题分解 + 贪心放置)

题意: 给你n*n的棋盘,让放置n个车 使他们之间并不能相互攻击 附加条件是 给定n个车的放置区间 用左上角和右下角的坐标来表示 解题思路: 首先明确 横向的约束和纵向的约束其实并不互相影响 所以可以对横向和纵向单独求解 把问题变成两个一维的区间选点问题来求解 另外 在取点的时候 有贪心的思路在里面 对于n个区间 应该先选择区间中r最小的区间进行放置可放置的点 可以简单认为这是因为r越小的区间 其选择的灵活性就越低. 我刚开始的时候 是采取了先放置区间长度小的 在放置l小的区间 不正确. cod

JavaScript脚本在页面中放置的位置

JavaScript脚本通常放置在三个位置: 1.head部分JavaScript脚本. 2.body部分JavaScript脚本. 3.单独以.js结尾的文件中的JavaScript脚本. 客户端会顺序读取并解析文档内容,body部分的JavaScript脚本会优先执行,其他部分的JavaScript脚本会通过调用执行. head部分JavaScript脚本 <html> <head> <script type="text/javascript">