【bzoj3175】[Tjoi2013]攻击装置
2016-08-11 15:21
387 查看
每两个能互相攻击且能放置的点连一条双向边,然后跑二分图最大点独立集即可
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define M 80010 #define N 210 struct edge { int to,next; }e[M<<1]; int head[M<<1]; int cnt; int ly[M]; int a ,flag[M]; char s ; int dx[]={1,1,2,2}; int dy[]={2,-2,1,-1}; int n,q; int tot,ans; void link(int x,int y) { e[++cnt]=(edge){y,head[x]}; head[x]=cnt; } bool find(int x) { for (int i=head[x];i;i=e[i].next) { int t=e[i].to; if (flag[t]!=q) { flag[t]=q; if (!ly[t] || find(ly[t])) { ly[t]=x; return true; } } } return false; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%s",s+1); for (int j=1;j<=n;j++) if (s[j]=='0') a[i][j]=++tot; else a[i][j]=0; } for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (a[i][j]) for (int k=0;k<4;k++) { int x=i+dx[k],y=j+dy[k]; if (x<1 || x>n || y<1 || y>n) continue; if (a[x][y]) link(a[i][j],a[x][y]),link(a[x][y],a[i][j]); } for (int i=1;i<=tot;i++) { q++; if (find(i)) ans++; } printf("%d\n",tot-ans/2); return 0; }
相关文章推荐
- bzoj 3175: [Tjoi2013]攻击装置
- [bzoj 3175--TJOI2013]攻击装置
- BZOJ 3175: [Tjoi2013]攻击装置
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
- BZOJ 3175 Tjoi2013 攻击装置 二分图最大匹配
- 【bzoj3175】 TJOI2013攻击装置 二分图最大独立集
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
- [二分图最大独立集][BZOJ 3175][TJOI 2013]攻击装置
- [bzoj-3175][Tjoi2013]攻击装置 题解
- bzoj 3175: [Tjoi2013]攻击装置
- BZOJ 3175: [Tjoi2013]攻击装置 二分图最大独立集
- 【bzoj4808】马&&【bzoj3175】[Tjoi2013]攻击装置
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
- BZOJ3175 [Tjoi2013]攻击装置
- BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配
- 【bzoj3175】【TJOI2013】【攻击装置】【二分图最大独立集】
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
- 【最大独立集】BZOJ3175- [Tjoi2013]攻击装置
- bzoj3175[Tjoi2013] 攻击装置
- [最小割]BZOJ 3175—— [Tjoi2013]攻击装置