lightoj 1304 The Best Contest Site Ever (二分匹配)
2015-08-17 15:02
501 查看
/* 分块 行的快为一方 列的为另一方进行匹配 */ # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; # define N 10010 int tot; int head ; int vis ; int link ; int uN; struct node { int to; int next; } Edge[N<<2]; void addEdge(int u,int v) { Edge[tot].to=v; Edge[tot].next=head[u]; head[u]=tot++; } int dfs(int x) { for(int i=head[x]; i!=-1; i=Edge[i].next) { int to=Edge[i].to; if(!vis[to]) { vis[to]=1; if(link[to]==-1||dfs(link[to])) { link[to]=x; return 1; } } } return 0; } int hungary() { int ans=0; memset(link,-1,sizeof(link)); for(int i=0; i<uN; i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } return ans; } int main() { int n,m,i,j,t; char a[110][110]; int hang[110][110],lie[110][110]; while(~scanf("%d",&t)) { int cas=0; while(t--) { memset(head,-1,sizeof(head)); tot=0; scanf("%d%d",&n,&m); for(i=0; i<n; i++) scanf("%s",&a[i]); int hh=0; int ll=0; memset(hang,0,sizeof(hang)); memset(lie,0,sizeof(lie)); for(i=0; i<n; i++) { for(j=0; j<m; j++) { if(a[i][j]!='W') { hang[i][j]=hh; if(j==m-1) hh++; } else { if(j!=0&&a[i][j-1]!='#') hh++; } } } for(i=0; i<m; i++) { for(j=0; j<n; j++) { if(a[j][i]!='W') { lie[j][i]=ll; if(j==n-1) ll++; } else { if(j!=0&&a[j-1][i]!='W') ll++; } } } uN=hh; for(i=0; i<n; i++) { for(j=0; j<m; j++) { if(a[i][j]=='.') { addEdge(hang[i][j],lie[i][j]); } } } printf("Case %d: %d\n",++cas,hungary()); for(i=0; i<n; i++) { for(j=0; j<m; j++) { if(a[i][j]=='.'&&link[lie[i][j]]==hang[i][j]) a[i][j]='T'; } } for(i=0;i<n;i++) { for(j=0;j<m;j++) printf("%c",a[i][j]); printf("\n"); } } } return 0; }
相关文章推荐
- 九度oj 1073
- UVA_10651_PebbleSolitaire
- 黑马程序员--java基础--网络编程TCP传输
- 首次涉水Maven+Jersey,入门笔记
- Unity3d的单例及场景间的数据传递
- OC继承的工作机制。
- sublime快捷键
- Objective-C 数据类型定义的标示符(一)
- android 实现真正意义上的服务及源代码下载
- zoj 3765 Lights(伸展树)
- Swift版 ScrollView和UITouch事件冲突
- Android WebView 因重定向无法正常goBack()解决方案
- NYOJ 104 最大和
- 状压DP问题
- sobel和laplace算子
- iOS自动检查更新
- 获取spring容器,以访问容器中定义的其他bean
- 当前窗口的高和宽
- oc 类的使用
- java 反射