bzoj3175: [Tjoi2013]攻击装置&&4808: 马
终于知道为啥网络流这么受欢迎了。
其实就是构个图模板一下的事儿,比较好打是吧。
然后这题网络流黑白染色(其实感觉上匈牙利更加直接好想啊,但是实际上黑白染色给人感觉就是二分图)
st连白而ed连黑,流量为1
不能同时出现的就建无限流量的边
然后sum-最小割
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- const int dx[]={-,-,-,,,,,-};
- const int dy[]={-,,,,,-,-,-};
- struct node
- {
- int x,y,c,next,other;
- }a[];int len,last[];
- void ins(int x,int y,int c)
- {
- int k1,k2;
- len++;k1=len;
- a[len].x=x;a[len].y=y;a[len].c=c;
- a[len].next=last[x];last[x]=len;
- len++;k2=len;
- a[len].x=y;a[len].y=x;a[len].c=;
- a[len].next=last[y];last[y]=len;
- a[k1].other=k2;
- a[k2].other=k1;
- }
- int st,ed,h[],list[];
- bool bt_h()
- {
- memset(h,,sizeof(h));h[st]=;
- int head=,tail=;list[]=st;
- while(head!=tail)
- {
- int x=list[head];
- for(int k=last[x];k;k=a[k].next)
- {
- int y=a[k].y;
- if(a[k].c>&&h[y]==)
- {
- h[y]=h[x]+;
- list[tail]=y;
- tail++;
- }
- }
- head++;
- }
- if(h[ed]==)return false;
- return true;
- }
- int findflow(int x,int f)
- {
- if(x==ed)return f;
- int s=;
- for(int k=last[x];k;k=a[k].next)
- {
- int y=a[k].y;
- if(a[k].c>&&h[y]==h[x]+&&s<f)
- {
- int t=findflow(y,min(a[k].c,f-s));
- s+=t;a[k].c-=t;a[a[k].other].c+=t;
- }
- }
- if(s==)h[x]=;
- return s;
- }
- int n,color[][];
- char ss[];
- bool mp[][];
- int point(int x,int y){return (x-)*n+y;}
- int main()
- {
- scanf("%d",&n);
- int br;
- int sum=;
- for(int i=;i<=n;i++)
- {
- scanf("%s",ss+);
- for(int j=;j<=n;j++)
- {
- if(ss[j]=='')mp[i][j]=true, sum++;
- else mp[i][j]=false;
- }
- }
- //-----sc-----
- memset(color,,sizeof(color));
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- if(j==)color[i][j]=-color[i-][j];
- else color[i][j]=-color[i][j-];
- //---paint_color---
- //----init-----
- st=n*n+,ed=n*n+;
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- if(mp[i][j]==true)
- {
- if(color[i][j]==)
- ins(st,point(i,j),);
- else
- ins(point(i,j),ed,);
- }
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- if(mp[i][j]==true&&color[i][j]==)
- for(int t=;t<=;t++)
- {
- int ti=i+dx[t],tj=j+dy[t];
- if(ti>&&ti<=n&&tj>&&tj<=n&&mp[ti][tj]==true)
- ins(point(i,j),point(ti,tj),);
- }
- //----composition------
- int ans=;
- while(bt_h()==true)
- {
- ans+=findflow(st,);
- }
- printf("%d\n",sum-ans);
- return ;
- }
bzoj3175: [Tjoi2013]攻击装置&&4808: 马的更多相关文章
- bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)
bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...
- BZOJ3175: [Tjoi2013]攻击装置
题解: 最大点独立集...好像水过头了... 不过发现我二分图好像忘完了!!! 代码: #include<cstdio> #include<cstdlib> #include& ...
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
传送门 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y ...
- BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集
题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...
- BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)
Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...
- 【BZOJ4808/3175】马/[Tjoi2013]攻击装置 最小割
[BZOJ4808]马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿" ...
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
黑白染成二分图, 然后不能同时选的就连边, 最大匹配数为m, t为不能放的数目, 则题目所求最大点独立集为 n*n-m-t -------------------------------------- ...
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...
随机推荐
- java虚拟机(四)--内存溢出、内存泄漏、SOF
学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...
- 01网页<head></head>常用标记及属性
网页<head></head>常用标记及属性 <!DOCTYPE html> <html> <head> <!--网页标题--> ...
- <东方梦符祭> N1无尽30波终于通了
嘛也算是第一次通关 纪念一下 阵容:xjb搭的杂牌队 主C:古明绝恋 露米娅(真·R卡战神)比那名居天子 斯卡雷特 控制:琪露诺 蕾蒂 灵梦 挂件:小伞 纳兹琳 古明地觉 永江依玖 第一发就直接抽到了 ...
- 【转载】linux下的zookeeper启动
zookeeper的安装目录:/usr/local/zookeeper-3.4.6/bin/zkServer.sh; 配置文件路径:../conf/zoo.cfg 端口 :2181: ZooKeepe ...
- java基础学习日志---File方法分析
package FunDemo; import java.io.File; import java.io.IOException; import java.util.Arrays; public cl ...
- 树状数组 & lowbit()
看了很多大佬的博客,每看一篇博客懂一部分,总算是大概理解了树状数组这个神奇又强大的东西: 在这里我做个整合,把我认为好的部分摘录下来: 参考博客1:https://blog.csdn.net/flus ...
- <MySQL>入门二 增删改 DML
-- DML语言 /* 数据操作的语言 插入:insert 修改:update 删除:delete */ 1.插入 -- 插入语句 /* 语法:insert into 表名(列名...) values ...
- 51nod1485 字母排序
[题解] 开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可.同时也有平衡树做 #include<cstdio> #include<algorith ...
- STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)
本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样 ...
- 【Codeforces 1027D】Mouse Hunt
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 先求出来强连通分量. 每个联通分量里面,显然在联通块的尽头(没有出度)放一个捕鼠夹就ok了 [代码] #include <bits/st ...