网络流
来源:互联网 发布:大数据在审计中的应用 编辑:程序博客网 时间:2024/06/01 11:16
HDU 5093 http://acm.hdu.edu.cn/showproblem.php?pid=5093
input
4 4
*ooo
o###
**#*
ooo*
output:
3
题意:有一个n*m 的图有 '*' 'o' '#' 三中符号
选尽量多的‘*’ 且保证任意同一行或同一列的两个‘*’之间至少有一个‘#’
网络流或二分匹配
建图:将每行每列的不存在#的 一段连续区间 离散化成点Ai,Bi.
源点S,汇点T
1 1 1 1
S -> Ai -> (作用域内的'*') -> Bi ->T
#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<vector>using namespace std;#define maxn 10000#define INF 999999999struct Edge{ int from,to,cap,flow; Edge(int a,int b,int c,int d){ from=a;to=b;cap=c;flow=d; }};int N,St,Nd;vector<Edge> edges;vector<int> G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];void AddEdge(int from,int to,int cap){ edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); int m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1);}void init(int n){ for(int i=0;i<=n;i++) G[i].clear(); edges.clear();}bool BFS(){ memset(vis,0,sizeof(vis)); queue<int> Q; d[St]=0; vis[St]=1; Q.push(St); while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++){ Edge & e=edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow){ vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[Nd];}int DFS(int x,int a){ if(x==Nd||a==0) return a; int flow=0,f; for(int & i=cur[x];i<G[x].size();i++){ Edge & e=edges[G[x][i]]; if(d[x]+1==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } if(!flow) d[x]=-1; return flow;}int Maxflow(int st,int nd){ St=st;Nd=nd; int flow=0; while(BFS()){ memset(cur,0,sizeof(cur)); flow+=DFS(St,INF); } return flow;}int n,m;char s[55][55];void solve(){ int st=n*m; int nd=n*m+1; int k=n*m+1; for(int i=0;i<n;i++){ k++; AddEdge(st,k,1); for(int j=0;j<m;j++){ if(s[i][j]=='#'){ k++; AddEdge(st,k,1); } if(s[i][j]=='*') AddEdge(k,i*m+j,1); } } for(int i=0;i<m;i++){ k++; AddEdge(k,nd,1); for(int j=0;j<n;j++){ if(s[j][i]=='#'){ k++; AddEdge(k,nd,1); } if(s[j][i]=='*') AddEdge(j*m+i,k,1); } } N=k+1; int ans=Maxflow(st,nd); printf("%d\n",ans);}int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); solve(); init(N); }}
0 0
- 【网络流】网络扩容
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- 【网络流】
- 【网络流】
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- 网络流
- java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widg
- 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别
- UVA - 10613(Storage Keepers(最优解不可组合))
- 【数据结构与算法】【查找】基本概念
- linux 内核移植和根文件系统的制作
- 网络流
- zabbix_sendmail.py
- Android-Universal-Image-Loader 图片加载库 详细分析
- C++隐式的类类型转换和类型转换运算符
- py2exe使用教程(六)——关于压缩文件
- Date()日期创建
- 织梦DedeCMS增加自定义文档属性四部曲
- jQuery中join方法
- android 根据原理分析ListView滑动checkbox状态被清除 不保存