BZOJ 3175 [Tjoi2013]攻击装置 二分图极大点独立集
2017-07-12 12:27
387 查看
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
第一行一个整数N,表示矩阵大小为N*N。接下来N行每一行一个长度N的01串,表示矩阵。Output
一个整数,表示在装置互不攻击的情况下最多可以放置多少个装置。Sample Input
3010
000
100
Sample Output
4HINT
100%数据 N<=200Source
传送门在两个可以到达的点之间连一条边,
简单地看到我们可以得到一个二分图,
如果两个点之间没有连边,那么就是无法攻击到,
我们要求的就是最多的点数。
很容易看到这就是要求去求出二分图内的极大点独立集。
极大点独立集=总点数-最小点覆盖数。
而最小点覆盖数=二分图最大匹配……
所以可以建个图,然后跑个匈牙利就好了。。
但是极限数据是4W啊……按理来说跑不过的……
看上去是匈牙利太快了?还是数据太水了……
不过建图的方式很值得琢磨……换了一种一直向下的双向的建图,
竟然比四周单向建图快了NNNN倍!
坑了我好久……一直T……
#include<bits/stdc++.h> using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0' || ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int N=205, M=40005, dx[4]={1,1,2,2}, dy[4]={-2,2,-1,1}; int n,tot,Ecnt,tag; int mp ; int vis[M],match[M]; struct Edge{ int next,to; }E[M<<3]; int head[M]; void add(int u,int v){ E[++Ecnt].next=head[u]; E[Ecnt].to=v; head[u]=Ecnt; } bool dfs(int u){ for (int i=head[u];i;i=E[i].next){ int j=E[i].to; if (vis[j]==tag) continue; vis[j]=tag; if (!match[j] || dfs(match[j])){ match[j]=u; return 1; } } return 0; } int main(){ n=read(); tot=0; char s ; for (int i=1;i<=n;i++){ scanf("%s",s); for (int j=0;j<n;j++) if (s[j]=='0') mp[i][j+1]=++tot; else mp[i][j+1]=0; } int x1,y1; Ecnt=0; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (mp[i][j]) for (int k=0;k<4;k++){ x1=i+dx[k],y1=j+dy[k]; if (x1<=0 || y1<=0 || x1>n || y1>n || !mp[x1][y1]) continue; add(mp[i][j],mp[x1][y1]); add(mp[x1][y1],mp[i][j]); } tag=0; int ans=0; memset(vis,0,sizeof(vis)); for (int i=1;i<=tot;i++){ tag++; if (dfs(i)) ans++; } ans>>=1; printf("%d\n",tot-ans); return 0; }
相关文章推荐
- 【bzoj3175】 TJOI2013攻击装置 二分图最大独立集
- 【bzoj3175】【TJOI2013】【攻击装置】【二分图最大独立集】
- BZOJ 3175: [Tjoi2013]攻击装置 二分图最大独立集
- BZOJ 3175 Tjoi2013 攻击装置 二分图最大匹配
- [二分图最大独立集][BZOJ 3175][TJOI 2013]攻击装置
- BZOJ3175 [Tjoi2013]攻击装置
- [bzoj 3175--TJOI2013]攻击装置
- [最小割]BZOJ 3175—— [Tjoi2013]攻击装置
- 【bzoj3175】[Tjoi2013]攻击装置
- BZOJ 3175: [Tjoi2013]攻击装置
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
- bzoj 3175: [Tjoi2013]攻击装置 最大独立集 网络流
- BZOJ 3175: [Tjoi2013]攻击装置
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
- [bzoj-3175][Tjoi2013]攻击装置 题解
- bzoj 3175: [Tjoi2013]攻击装置
- BZOJ3175: [Tjoi2013]攻击装置
- 【bzoj4808】马&&【bzoj3175】[Tjoi2013]攻击装置
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)
- BZOJ3175 Tjoi2013 攻击装置(二分图匹配)