POJ 3020 Hungary
2024-08-31 09:21:06
一道建图题……
// by SiriusRen
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1666
int h,w,v[N],next[N],first[N],tot,cnt,cases,map[55][55],fa[N],ans;
char a[55][55],xx[]={1,-1,0,0},yy[]={0,0,1,-1},vis[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
bool dfs(int x){
for(int i=first[x];~i;i=next[i])
if(!vis[v[i]]){
vis[v[i]]=1;
if(!fa[v[i]]||dfs(fa[v[i]]))
{fa[v[i]]=x;return 1;}
}
return 0;
}
int main(){
scanf("%d",&cases);
while(cases--){
tot=0;cnt=ans=0;memset(map,0,sizeof(map));
memset(first,-1,sizeof(first)),memset(fa,0,sizeof(fa));
scanf("%d%d",&h,&w);
for(int i=1;i<=h;i++)
for(int j=0;j<=w;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='*')map[i][j]=++cnt;
else map[i][j]=0;
}
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
if(map[i][j])
for(int k=0;k<4;k++)
if(map[i+xx[k]][j+yy[k]])
add(map[i][j],map[i+xx[k]][j+yy[k]]);
for(int i=1;i<=cnt;i++,memset(vis,0,sizeof(vis)))
if(dfs(i))ans++;
printf("%d\n",cnt-ans/2);
}
}
最新文章
- Android开发学习——应用安装过程
- SpringMVC学习总结(三)——Controller接口详解(1)
- Problem A+B
- 简明的例子讲解position:relative、float、overflow:hidden和inline-block
- strlen与sizeof有什么区别?
- 请不要在广州.NET俱乐部群里谈郑智话题,谢谢!
- 【洛谷P1516】青蛙的约会
- CentOS 7系统上添加netcdf库
- 算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)
- (转)你应该知道的RPC原理
- WPF窗体的生命周期
- vue-自定义全局键盘码
- Mac下android studio卡,居然这么解决了。。。。
- 2018.11.30 bzoj3230: 相似子串(后缀数组)
- win10 无法打开 APICloud Studio 2 的解决方案
- 菜鸟学Java(二十一)——如何更好的进行单元测试——JUnit
- Thunder——Final发布
- Linux系统下 Apache+PHP 环境安装搭建
- SpringData_PagingAndSortingRepository接口
- ffmpeg源码分析--av_find_best_stream <;转>;