BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)
Description
给定一个01矩阵,其中你可以在0的位置放置攻击装置。每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1), (x+1,y+2),(x+2,y+1)
求在装置互不攻击的情况下,最多可以放置多少个装置。
Input
Output
Sample Input
010
000
100
Sample Output
HINT
100%数据 N<=200
Solution
数组咋又双叒叕开小了……不过竟然还有90 数据良心(划掉)
第一眼读完题:这咋和炮兵阵地这么像,状压没跑了!
为了验证点击题解:网络流
emmm……我好像傻了这不就是骑士共存么= =……
裸的二分图最大独立集啊QAQ
Code
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<queue>
- #define M (1000000+10)
- #define N (40000+10)
- #define id(x,y) (x-1)*n+y
- using namespace std;
- struct node
- {
- int Flow;
- int next;
- int to;
- } edge[M*];
- int Depth[N];
- int head[N],num_edge,cnt;
- int n,m,s,e,x,y,INF,a[][],color[][];
- int dx[]= {,-,-,+,+,-,-,+,+};
- int dy[]= {,-,-,-,-,+,+,+,+};
- char st[N];
- queue<int>q;
- void add(int u,int v,int l)
- {
- edge[++num_edge].to=v;
- edge[num_edge].Flow=l;
- edge[num_edge].next=head[u];
- head[u]=num_edge;
- }
- bool Bfs(int s,int e)
- {
- memset(Depth,,sizeof(Depth));
- q.push(s);
- Depth[s]=;
- while (!q.empty())
- {
- int x=q.front();
- q.pop();
- for (int i=head[x]; i!=; i=edge[i].next)
- if (!Depth[edge[i].to] && edge[i].Flow>)
- {
- Depth[edge[i].to]=Depth[x]+;
- q.push(edge[i].to);
- }
- }
- return Depth[e];
- }
- int Dfs(int x,int low)
- {
- int Min,f=;
- if (x==e || low==)
- return low;
- for (int i=head[x]; i!=; i=edge[i].next)
- if (edge[i].Flow> && Depth[edge[i].to]==Depth[x]+ && (Min=Dfs(edge[i].to,min(low,edge[i].Flow))))
- {
- edge[i].Flow-=Min;
- edge[((i-)^)+].Flow+=Min;
- low-=Min;
- f+=Min;
- if (low==) return f;
- }
- if (!f) Depth[x]=-;
- return f;
- }
- int Dinic(int s,int e)
- {
- int Ans=;
- while (Bfs(s,e))
- Ans+=Dfs(s,0x7fffffff);
- return Ans;
- }
- int main()
- {
- scanf("%d",&n);
- s=,e=*+;
- for (int i=; i<=n; ++i)
- {
- scanf("%s",st);
- for (int j=; j<=n; ++j)
- {
- a[i][j]=st[j-]-'';
- color[i][j]=(i+j)%;
- if (a[i][j]==) continue;
- cnt++;
- if (color[i][j]==) add(s,id(i,j),), add(id(i,j),s,);
- else add(id(i,j),e,), add(e,id(i,j),);
- }
- }
- for (int i=; i<=n; ++i)
- for (int j=; j<=n; ++j)
- {
- if (a[i][j]== || color[i][j]==) continue;
- for (int k=; k<=; ++k)
- {
- int x=i+dx[k],y=j+dy[k];
- if (x< || x>n || y< || y>n || a[x][y]==) continue;
- add(id(i,j),id(x,y),);
- add(id(x,y),id(i,j),);
- }
- }
- printf("%d",cnt-Dinic(s,e));
- }
BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)的更多相关文章
- BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集
题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...
- bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)
bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...
- BZOJ3175: [Tjoi2013]攻击装置
题解: 最大点独立集...好像水过头了... 不过发现我二分图好像忘完了!!! 代码: #include<cstdio> #include<cstdlib> #include& ...
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
传送门 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y ...
- [TJOI2013] 攻击装置 - 二分图匹配
给定 \(N \times N\) 棋盘,某些格子是障碍,问可以放置的互不侵犯的马的个数 黑白染色后建立二分图,求最大独立集 = 总点数 - 最大匹配数 注意把反边也连上会WA掉(脑抽一发血) #in ...
- bzoj3175: [Tjoi2013]攻击装置&&4808: 马
终于知道为啥网络流这么受欢迎了. 其实就是构个图模板一下的事儿,比较好打是吧. 然后这题网络流黑白染色(其实感觉上匈牙利更加直接好想啊,但是实际上黑白染色给人感觉就是二分图) st连白而ed连黑,流量 ...
- BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配
BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置 ...
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
随机推荐
- DataSet常用简单方法
Clear移除表中所有行来清除任何数据的DataSet Clone赋值该DataSet的结构但不复制数据 Copy赋值DataSet的结构和数据 Dispose释放DataSet对象 Equals确定 ...
- C# 日历类
using System; namespace DotNet.Utilities { /// <summary> /// 农历属性 /// </summary> public ...
- 15、IO (转换流、缓冲流)
转换流概述 * A: 转换流概述 * a: 转换流概述 * OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节 * 将字符串按照指定的 ...
- 1、类、封装(私有private、this关键字)
类与对象 对象在需求中的使用 对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. 我们把大象装冰箱为例进行分析. 在针对具体的需求,可以使用名词 ...
- 前端(十二):react-redux实现逻辑
一.context实现数据传递 在react中,props和state都可以设置数据.不同的是,props借助组件属性传递数据但不可以渲染组件,它相对来说是“静态的”:state可以监听事件来修改数据 ...
- HDFS学习
HDFS体系结构 HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)(如图所示).名称节点作为中心服务器, ...
- BZOJ2987:Earthquake(类欧几里德算法)
Sol 设 \(n=\lfloor\frac{c}{a}\rfloor\) 问题转化为求 \[\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i= ...
- [JSOI2008]最大数 线段树解法
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...
- 理解webpack4.splitChunks之maxInitialRequests
maxInitialRequests是splitChunks里面比较难以理解的点之一,它表示允许入口并行加载的最大请求数,之所以有这个配置也是为了对拆分数量进行限制,不至于拆分出太多模块导致请求数量过 ...
- jQuery轮播图(一)轮播实现并封装
利用面向对象自己动手写了一个封装好的jquery轮播组件,可满足一般需求,不仅使用简单且复用性高. demo:点此预览 代码地址:https://github.com/zsqosos/componen ...