bzoj3175 [Tjoi2013]攻击装置 二分图匹配
2018-01-08 17:03
441 查看
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)求在装置互不攻击的情况下,最多可以放置多少个装置。
100%数据 N<=200
Solution
总点数-二分图匹配。之前做过poj类似的题算是复习了根据点横纵坐标分奇偶点,然后连边即可。加上当前弧优化跑得巨快
Code
#include <stdio.h> #include <string.h> #include <queue> #define rep(i,st,ed) for (int i=st;i<=ed;++i) #define fill(x,t) memset(x,t,sizeof(x)) #define min(x,y) ((x)<(y)?(x):(y)) const int INF=0x3f3f3f3f; const int N=80505; const int E=640005; const int L=205; struct edge{int x,y,w,next;}e[E]; std:: queue<int> queue; int dx[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,2},{1,-2},{2,1},{2,-1}}; int cur ,ls ,edCnt=1; int dis ; char rc[L][L]; int read() { int x=0,v=1; char ch=getchar(); for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):v,ch=getchar()); for (;ch>='0'&&ch<='9';x=x*10+ch-'0',ch=getchar()); return x*v; } void addEdge(int x,int y,int w) { e[++edCnt]=(edge){x,y,w,ls[x]}; ls[x]=edCnt; e[++edCnt]=(edge){y,x,0,ls[y]}; ls[y]=edCnt; } bool bfs(int st,int ed) { while (!queue.empty()) queue.pop(); queue.push(st); fill(dis,-1); dis[st]=1; while (!queue.empty()) { int now=queue.front(); queue.pop(); for (int i=ls[now];i;i=e[i].next) { if (e[i].w>0&&dis[e[i].y]==-1) { queue.push(e[i].y); dis[e[i].y]=dis[now]+1; if (e[i].y==ed) return 1; } } } return 0; } int dfs(int now,int ed,int mn) { if (now==ed||!mn) return mn; int ret=0; for (int &i=cur[now];i;i=e[i].next) { if (e[i].w>0&&dis[now]+1==dis[e[i].y]) { int d=dfs(e[i].y,ed,min(e[i].w,mn-ret)); e[i].w-=d; e[i^1].w+=d; ret+=d; if (ret==mn) break; } } return ret; } int dinic(int st,int ed) { int ret=0; while (bfs(st,ed)) { rep(i,st,ed) cur[i]=ls[i]; ret+=dfs(st,ed,INF); } return ret; } int main(void) { int n; scanf("%d",&n); int cnt=0; rep(i,1,n) scanf("%s", rc[i]+1); rep(i,1,n) rep(j,1,n) { if (rc[i][j]=='0') cnt++; if ((i^j)&1&&rc[i][j]=='0') { addEdge(0,(i-1)*n+j,1); rep(k,0,7) { int ti=i+dx[k][0],tj=j+dx[k][1]; if (ti>0&&ti<=n&&tj>0&&tj<=n&&rc[ti][tj]=='0') { addEdge((i-1)*n+j,(ti-1)*n+tj,1); } } } else if (rc[i][j]=='0') addEdge((i-1)*n+j,n*n+1,1); } int mxFlow=dinic(0,n*n+1); printf("%d\n",cnt-mxFlow); return 0; }
相关文章推荐
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
- BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配
- BZOJ3175 [Tjoi2013]攻击装置
- BZOJ3175: [Tjoi2013]攻击装置
- [bzoj-3175][Tjoi2013]攻击装置 题解
- [二分图最大独立集][BZOJ 3175][TJOI 2013]攻击装置
- bzoj 3175: [Tjoi2013]攻击装置 最大独立集 网络流
- 【bzoj4808】马&&【bzoj3175】[Tjoi2013]攻击装置
- BZOJ 3175 Tjoi2013 攻击装置 二分图最大匹配
- BZOJ 3175: [Tjoi2013]攻击装置
- 【bzoj3175】【TJOI2013】【攻击装置】【二分图最大独立集】
- bzoj 3175: [Tjoi2013]攻击装置
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
- BZOJ 3175 [Tjoi2013]攻击装置 二分图极大点独立集
- [最小割]BZOJ 3175—— [Tjoi2013]攻击装置
- 【bzoj3175】 TJOI2013攻击装置 二分图最大独立集
- BZOJ 3175: [Tjoi2013]攻击装置
- bzoj3175[Tjoi2013] 攻击装置