【图论】[ZOJ1002]Fire Net
来源:互联网 发布:java 打飞船的游戏 编辑:程序博客网 时间:2024/06/08 12:57
题目
二分图匹配,建图方式巧妙,横向连通块(在一行,中间没有障碍物)、纵向连通块分别为x,y部,相交的连边,求最大匹配。
#include<cstdio>#include<cstring>#define MAXN 4int n,a[MAXN+10][MAXN+10],cnt,cnt1,c[MAXN*MAXN*2+10],ans;char s[MAXN+2][MAXN+2];bool vis[MAXN*MAXN*2+10];struct node{ int v; node *next;}edge[MAXN*MAXN*MAXN*MAXN*2+10],*adj[MAXN*MAXN*2+10],*ecnt=edge;void addedge(int u,int v){ node *p=++ecnt; p->v=v; p->next=adj[u]; adj[u]=p;}bool dfs(int u){ int v; for(node *p=adj[u];p;p=p->next){ v=p->v; if(!vis[v]){ vis[v]=1; if(!c[v]||dfs(c[v])){ c[u]=v; c[v]=u; return 1; } } } return 0;}void maxmatch(){ for(int i=1;i<=cnt1;i++){ memset(vis,0,sizeof vis); if(!c[i]&&dfs(i)) ans++; }}int main(){ int i,j; while(scanf("%d",&n)){ if(!n) return 0; memset(c,0,sizeof c); memset(adj,0,sizeof adj); memset(a,0,sizeof a); ans=cnt=0; ecnt=edge; for(i=1;i<=n;i++) scanf("%s",s[i]+1); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ if(s[i][j]!='.') continue; if(s[i][j-1]!='.') cnt++; a[i][j]=cnt; } cnt1=cnt; for(j=1;j<=n;j++) for(i=1;i<=n;i++){ if(s[i][j]!='.') continue; if(s[i-1][j]!='.') cnt++; addedge(a[i][j],cnt); addedge(cnt,a[i][j]); } maxmatch(); printf("%d\n",ans); }}
0 0
- 【图论】[ZOJ1002]Fire Net
- zoj1002 Fire Net
- ZOJ1002 Fire Net
- fire net(zoj1002)
- fire net(zoj1002)
- zoj1002-Fire Net
- [题解] ZOJ1002 -- Fire Net
- ZOJ1002 FIRE NET
- zoj1002(Fire Net)
- [DFS]zoj1002 Fire Net
- zoj1002 Fire Net
- zoj1002-Fire Net
- HDU1045&&ZOJ1002-Fire Net
- HDU1045 ZOJ1002 Fire Net
- zoj1002 Fire Net
- ZOJ1002 Fire Net(DFS)
- zoj1002——Fire Net
- ZOJ1002 Fire Net(非递归版)
- URAL 1009K-based Numbers dp练习
- java与python在处理大文件操作上的对比
- C++内联函数总结
- SQL入门经典3-8章节笔记
- 【图论】[CQBZOJ1362] 苗条的生成树
- 【图论】[ZOJ1002]Fire Net
- Ajax提高篇(7)Ajax实现简单的下拉框联动显示数据
- HTML 5 <input> placeholder 属性
- C++中的指针和指针的引用
- 如何理解file‘s owner
- Masonry介绍与使用实践:快速上手Autolayout
- 安装Android Studio结束时提示VT is not enabled in the system
- 2015 多校联赛 ——HDU5410(dp)
- 【图论】[ZOJ1054]Place the Robots