POJ 3020 Antenna Placement 匈牙利算法,最大流解法 难度:1
2015-08-24 16:03
429 查看
http://poj.org/problem?id=3020
View Code
#include <cstdio> #include <cstring> #include <vector> using namespace std; char maz[62][62]; int e[500][500]; int d[4][2]={0,1,0,-1,1,0,-1,0}; int n,m; vector <int > G[500]; bool vis[500]; void addedge(int from,int to){ e[from][to]=1; G[from].push_back(to); } int dfs(int s){ vis[s]=true; if(s==n*m+1){//printf("dfs %d ok\n",s); return 1;} for(int i=0;i<G[s].size();i++){ if(!vis[G[s][i]]&&e[s][G[s][i]]&&dfs(G[s][i])){ e[s][G[s][i]]=0; e[G[s][i]][s]=1; // printf("dfs %d ok\n",s); return 1; } } //printf("dfs %d failed \n",s); return 0; } int maxflow(){ int ans=0,f; while(1){ f=dfs(n*m); memset(vis,0,sizeof(vis)); if(f==0)break; ans+=f; } return ans; } void printe(){ for(int i=0;i<m*n+2;i++){ bool f=false; for(int j=0;j<m*n+2;j++){ if(e[i][j]){printf("e[%d][%d] ",i,j);f=true;} } if(f) printf("\n"); } } int main(){ int t; scanf("%d",&t); while((t--)&&scanf("%d%d",&n,&m)==2){ for(int i=0;i<=n*n+1;i++){G[i].clear();} memset(e,0,sizeof(e)); for(int i=0;i<n;i++){ scanf("%s",maz[i]); } int ans=0; int star=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(maz[i][j]=='*'){ star++; if((i+j)&1){ addedge(n*m,i*m+j);//n*n s n*n+1 t // printf("addedge %d %d %d %d:%d to %d\n",n,0,i,j,n*m,i*m+j); for(int k=0;k<4;k++){ int nx=i+d[k][0]; int ny=j+d[k][1]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&maz[nx][ny]=='*'){ addedge(i*m+j,nx*m+ny); // printf("addedge %d %d %d %d:%d to %d\n",i,j,nx,ny,i*m+j,nx*m+ny); } } } else { addedge(i*m+j,n*m+1); //printf("addedge %d %d %d %d:%d to %d\n",i,j,n,1,i*m+j,n*m+1); for(int k=0;k<4;k++){ int nx=i+d[k][0]; int ny=j+d[k][1]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&maz[nx][ny]=='*'){ addedge(i*m+j,nx*m+ny); e[i*m+j][nx*m+ny]=0; // printf("addedge %d %d %d %d:%d to %d\n",i,j,nx,ny,i*m+j,nx*m+ny); } } } } } } ans=maxflow(); printf("%d\n",star-ans); } return 0; }
View Code
相关文章推荐
- firefox HackBar组件模拟请求POST请求
- Coding 两步认证技术介绍
- 解决Fetching android sdk component information加载过久问题
- java中观察者模式
- 递归分析和分治算法
- 小试随机森林(random forest)算法ml
- 信任
- [python] 爬取网站所有的URL
- Cache
- ElasticSearch+LogStash+Kibana+Redis搭建日志管理服务
- Android layer-list 圆角阴影背景
- Gearman介绍、调研、测试与原理分析
- STL学习----入门(1)[iterator]
- 调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备
- Android Cursor
- Wireshark 与 TCP/IP四层模型
- C++ 入门教程(五) 使用 std::cout 输出和数字分位符的使用
- 学习android 显式Intent和隐式Intent
- 高效实用内存
- hdoj 3665 Seaside