BZOJ 3175 最大独立集
思路:
最大独立集嘛 用nlogn的Dinic做
//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 888888
int n,re[205][205],cnt,first[40050],next[N],v[N],w[N],vis[40050],tot,T,jy,ans;
char a[205][205],xx[]={1,-1,2,-2,1,-1,2,-2},yy[]={2,-2,1,-1,-2,2,-1,1};
void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}
bool tell(){
memset(vis,-1,sizeof(vis)),vis[0]=0;
queue<int>q;q.push(0);
while(!q.empty()){
int t=q.front();q.pop();
for(int i=first[t];~i;i=next[i])
if(!~vis[v[i]]&&w[i])
vis[v[i]]=vis[t]+1,q.push(v[i]);
}return ~vis[T];
}
int zeng(int x,int y){
if(x==T)return y;
int r=0;
for(int i=first[x];~i&&y>r;i=next[i])
if(vis[v[i]]==vis[x]+1&&w[i]){
int t=zeng(v[i],min(y-r,w[i]));
w[i]-=t,w[i^1]+=t,r+=t;
}
if(!r)vis[x]=-1;
return r;
}
int main(){
memset(first,-1,sizeof(first));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",a[i]+1);
for(int j=1;j<=n;j++){
a[i][j]-='0';
if(!a[i][j])re[i][j]=++cnt;
}
}
T=cnt+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)if(re[i][j]){
if((i+j)&1){
add(0,re[i][j],1);
for(int k=0;k<8;k++){
int dx=i+xx[k],dy=j+yy[k];
if(dx>=1&&dy>=1&&re[dx][dy])
add(re[i][j],re[dx][dy],1);
}
}
else{
add(re[i][j],T,1);
for(int k=0;k<8;k++){
int dx=i+xx[k],dy=j+yy[k];
if(dx>=1&&dy>=1&&re[dx][dy])
add(re[dx][dy],re[i][j],1);
}
}
}
while(tell())while(jy=zeng(0,0x3fffffff))ans+=jy;
printf("%d\n",cnt-ans);
}
BZOJ 3175 最大独立集的更多相关文章
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
黑白染成二分图, 然后不能同时选的就连边, 最大匹配数为m, t为不能放的数目, 则题目所求最大点独立集为 n*n-m-t -------------------------------------- ...
- 【刷题】BZOJ 3175 [Tjoi2013]攻击装置
Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1), ...
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...
- BZOJ 3175: [Tjoi2013]攻击装置
捉水题真是捉上瘾了TUT Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y- ...
- BZOJ 1143: [CTSC2008]祭祀river 最大独立集
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题解: 给你一个DAG,求最大的顶点集,使得任意两个顶点之间不可达. 把每个顶点v ...
- BZOJ 1143: [CTSC2008]祭祀river(最大独立集)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1143 一句话题意:给一个DAG(有向无环图),求选出尽量多的点使这些点两两不可达,输出点个 ...
- bzoj 1143 二分图最大独立集
我们可以将一个点拆成两个点x,y,那么如果存在一条i->j的路径,我们就连接xi,yj,那么答案就是n-最大匹配数. 因为i->j所以对于i与j只能选一个,那么我们只需要求出来二分图的最大 ...
- BZOJ 4808 马 二分图最大独立集
题目应该就是最大独立集了吧,没什么了,平面图求最大独立集需要/2的, WQH说加直接+双向边考研过,结果真的过了,应该是匈牙利算法寻找的 时候更加快了吧.(方便找边) #include<cstd ...
- BZOJ 4808 二分图最大独立集
思路: 棋盘是个二分图 那就把一个可以走的白点 向所有可以走的黑点连边 跑一个最大匹配 (匹配上了就代表这两个点不能共存) 最大独立集=sum-最大匹配 //By SiriusRen #incl ...
随机推荐
- 运算符 and or ont
运算符 逻辑运算: and 并且的意思. 左右两端的值必须都是真. 运算结果才是真 or 或者的意思. 左右两端有一个是真的. 结果就是真. 全部是假. 结果才能是假 not 非的意思. 原来是假. ...
- ubuntu中不能远程连接解决
今天装好ubuntu19.04之后不能远程连接,网上找了很久终于自己解决了.ap 步骤如下:希望对各位有用,哪里不对请指出 第一步我们需要加载openssh-server 等待加载完毕后, ...
- Xml实现图片旋转
1. 需求:不使用Java代码,实现旋转图片动画 2.实现:使用Progressbar控件 3. anim/anim_loading.xml <?xml version="1.0&qu ...
- SQL的where执行顺序
SQL的where执行顺序 1 mysql 从左到右. 一个原则,排除越多的条件放到第一个 例子:抄的. SELECT … WHERE p.languages_id = 1 AND m.languag ...
- Pyhton学习——Day36
#异步IO——Asynchronous#异步效率最高,特点:全程无阻塞# 在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义.# Stevens给出的定 ...
- jq——属性和方法
ps:所有元素要加上“” 属性: 1) attr:属性,元素.attr(); 获取属性 $("input").click(function(){ console.log($( ...
- 8、Collaborative Metric Learning
一.摘要: 文章的核心思想:是如何把Metric learning 和 CF结合起来从而达到更好的推荐效果. 提出了CML(Collaborative Metric Learning),其学习一个联合 ...
- T^T OJ 2144 并查集( 并查集... )
链接:传送门 思路:增加num[] 记录集合中的个数,maxx[] 记录集合中最大值,挺不错的并查集练习题,主要是 unite 函数里如何改变一些东西,挺好的题,能用C尽量不用C++,效率差蛮大的! ...
- HDU 2256 Problem of Precision( 矩阵快速幂 )
链接:传送门 题意:求式子的值,并向下取整 思路: 然后使用矩阵快速幂进行求解 balabala:这道题主要是怎么将目标公式进行化简,化简到一个可以使用现有知识进行解决的一个过程!菜的扣脚...... ...
- java对word文档的操作(提取标题和内容等)-直接操作或poi工具包或freemarker+xml或html转word
1,java自带工具包实现对word的排版和写入 import java.awt.Color; import java.io.FileNotFoundException; import java.io ...