zoj3646二分匹配
来源:互联网 发布:无线信号放大软件 编辑:程序博客网 时间:2024/05/21 08:04
这是我zoj的第一道题,比赛的时候怎么也想到是二分匹配。想到将它转化为图,将U看做是1,D 看做是0,将整张图看做是一个邻接矩阵,求每个点是否有自环或者是回路。但是,这都没想到是二分匹配。。。。惭愧啊。。。。
#include <iostream>#include <stdio.h>using namespace std;const int oo=1e8;const int mm=111111;const int mn=999;int node,src,dest,edge;int ver[mm],flow[mm],next[mm];int head[mn],work[mn],dis[mn],q[mn];void prepare(int _node,int _src,int _dest){ node=_node,src=_src,dest=_dest; for(int i=0;i<node;i++) head[i]=-1; edge=0;}void addedge(int u,int v,int c){ ver[edge]=v;flow[edge]=c;next[edge]=head[u];head[u]=edge++; ver[edge]=u;flow[edge]=0;next[edge]=head[v];head[v]=edge++;}bool Dinic_bfs(){ int i,u,v,l,r=0; for(i=0;i<node;i++) dis[i]=-1; dis[q[r++]=src]=0; for(l=0;l<r;l++) for(i=head[u=q[l]];i>=0;i=next[i]) if(flow[i]&&dis[v=ver[i]]<0) { dis[q[r++]=v]=dis[u]+1; if(v==dest) return 1; } return 0;}int Dinic_dfs(int u,int exp){ if(u==dest) return exp; for(int &i=work[u],v,tmp;i>=0;i=next[i]) { if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0) { flow[i]-=tmp; flow[i^1]+=tmp; return tmp; } } return 0;}int Dinic_flow(){ int i,ret=0,delta; while(Dinic_bfs()) { for(i=0;i<node;i++) work[i]=head[i]; while(delta=Dinic_dfs(src,oo)) ret+=delta; } return ret;}int main(){ int n,tmpx,i,j; char ch[mn]; while(scanf("%d",&n)!=EOF) { prepare(n+n+2,0,n+n+1); for(i=1;i<=n;i++) { scanf("%s",ch); for(j=0;j<n;j++) { if(ch[j]=='U') addedge(i,n+j+1,1); } } for(i=1;i<=n;i++) addedge(src,i,1),addedge(i+n,dest,1); tmpx=Dinic_flow(); if(tmpx==n) printf("YES\n"); else printf("NO\n"); } return 0;}
- zoj3646二分匹配
- 二分匹配ZOJ3646
- Matrix Transformer zoj3646 (二分图最大匹配)
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- 二分匹配
- Symbian 文本编辑器(Editor) (转)
- 微软虚拟键代码
- 螺旋队列
- 2个cv和machine learning博客地址
- JavaScript自定义函数,自定义函数属性、函数方法等等
- zoj3646二分匹配
- win32汇编设置编译环境
- STL简介
- 寻找二叉树中两个子节点的最近父节点
- GridView自动动态排版
- 如何对网站进行SQL注入
- 整数转成字符串
- HDU 2196 Computer (tree-DP 树的最长路 经典) #by Plato
- boost::thread使用方法