uva 12549 最大流
思路:这题的原型题是比较经典的网络流。原型题模型就是把所有的障碍去掉。
有障碍做法还是一样的,只用将每个列和行重新划分,求最大流就行了。
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <cstdio>
- #define Maxn 120010
- #define Maxm 210000
- #define LL int
- #define inf 100000000
- #define Abs(a) (a)>0?(a):(-a)
- using namespace std;
- struct Edge{
- int from,to,next;
- LL val;
- }edge[Maxm];
- const double eps=1e-;
- LL value[Maxn];
- int head[Maxn],work[Maxn],dis[Maxn],q[Maxn],e,vi[Maxn];
- void init()
- {
- e=;
- memset(head,-,sizeof(head));
- }
- void add1(int u,int v,LL c)//有向边
- {
- edge[e].to=v;edge[e].val=c;edge[e].next=head[u];head[u]=e++;
- edge[e].to=u;edge[e].val=;edge[e].next=head[v];head[v]=e++;
- }
- void add2(int u,int v,LL c)//无向边
- {
- edge[e].to=v;edge[e].val=c;edge[e].next=head[u];head[u]=e++;
- edge[e].to=u;edge[e].val=c;edge[e].next=head[v];head[v]=e++;
- }
- int bfs(int S,int T)
- {
- int rear=;
- memset(dis,-,sizeof(dis));
- dis[S]=;q[rear++]=S;
- for(int i=;i<rear;i++)
- {
- for(int j=head[q[i]];j!=-;j=edge[j].next)
- {
- if(edge[j].val&&dis[edge[j].to]==-)
- {
- dis[edge[j].to]=dis[q[i]]+;
- q[rear++]=edge[j].to;
- if(edge[j].to==T) return ;
- }
- }
- }
- return ;
- }
- LL dfs(int cur,LL a,int T)
- {
- if(cur==T) return a;
- for(int &i=work[cur];i!=-;i=edge[i].next)
- {
- if(edge[i].val&&dis[edge[i].to]==dis[cur]+)
- {
- LL t=dfs(edge[i].to,min(a,edge[i].val),T);
- if(t)
- {
- edge[i].val-=t;
- edge[i^].val+=t;
- return t;
- }
- }
- }
- return ;
- }
- LL Dinic(int S,int T)
- {
- LL ans=;
- while(bfs(S,T))
- {
- memcpy(work,head,sizeof(head));
- while(LL t=dfs(S,inf,T)) ans+=t;
- }
- return ans;
- }
- int g[][],row,col,beg[][],gg[][];
- void build(int n,int m)
- {
- int i,j,f=;
- row=col=;
- for(i=;i<=m;i++){
- f=;
- for(j=;j<=n;j++){
- if(g[j][i]==) f=;
- if(g[j][i]!=&&!f) col++,f=;
- if(g[j][i]!=)
- beg[j][i]=col;
- }
- }
- for(i=;i<=n;i++){
- f=;
- for(j=;j<=m;j++){
- if(g[i][j]==) f=;
- if(g[i][j]!=&&!f) row++,f=;
- if(g[i][j]!=)
- gg[i][j]=row;
- }
- }
- for(i=;i<=row;i++){
- add1(,i,);
- }
- for(i=;i<=col;i++){
- add1(i+row,row+col+,);
- }
- for(i=;i<=n;i++){
- for(j=;j<=m;j++){
- if(g[i][j]==){
- add1(gg[i][j],beg[i][j]+row,);
- }
- }
- }
- }
- int main()
- {
- int n,m,i,j,num=,t,x,y,p,w;
- scanf("%d",&t);
- while(t--){
- init();
- memset(g,,sizeof(g));
- memset(beg,,sizeof(beg));
- memset(gg,,sizeof(gg));
- scanf("%d%d",&n,&m);
- scanf("%d",&p);
- for(i=;i<=p;i++){
- scanf("%d%d",&x,&y);
- g[x][y]=;
- }
- scanf("%d",&w);
- for(i=;i<=w;i++){
- scanf("%d%d",&x,&y);
- g[x][y]=;
- }
- build(n,m);
- if(row==||col==||p==){
- printf("0\n");
- continue;
- }
- int ans=Dinic(,row+col+);
- printf("%d\n",ans);
- }
- return ;
- }
uva 12549 最大流的更多相关文章
- uva 12549
12549 - Sentry Robots Time limit: 1.000 seconds We need to guard a set of points of interest using s ...
- UVa 11082 & 最大流的行列模型
题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...
- uva 10330 最大流
拆点 将节点 i 的容量拆成从 i 到 i+n 的边的容量 套用最大流模板 ac #include <cstdio> #include <cstdlib> #include ...
- 【网络流#5】UVA 11082 最大流
网络流题目最有意思的地方就是构图了,毕竟套模板每个人都会的 现在有一个矩阵,已知前i行元素之和a[i](1<=i<=n),前j列元素之和b[j](1<=j<=m),求一个可行的 ...
- 【网络流#4】UVA 753 最大流
最近开始刷网络流的题目了,先从紫书上的开始,这道题是P374上的,嘛,总之这道题最终还是参考了一下紫书. 中间是用了STL中map将字符串映射成编号,使用编号总比是用字符串简单的多. 超级源点S与各个 ...
- UVA 12549 - 二分图匹配
题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...
- UVa 10806 & 费用流+意识流...
题意: 一张无向图,求两条没有重复的从S到T的路径. SOL: 网络流为什么屌呢..因为网络流的容量,流量,费用能对许许多多的问题进行相应的转化,然后它就非常的屌. 对于这道题呢,不是要没有重复吗?不 ...
- uva 11380(最大流+拆点)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36707 思路:根据题意拆点建图即可. #include<io ...
- UVa 12549 机器人警卫(最小点覆盖)
https://vjudge.net/problem/UVA-12549 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个 ...
随机推荐
- C#.Net中的非托管代码清理
帮助其它项目组Review代码过程,发现有些地方实现了IDispose接口,同时也发现了一些关于IDispose的问题: 1.A类型实现了IDispose接口,B类型里面含有A类型的字段,B类型没有实 ...
- 开发extjs常用的插件
Spket是目前支持Ext 2.0最为出色的IDE. 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中.注:不支持配置项的代码提示 ...
- hdu4291之矩阵快速幂
A Short problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- uva193 - Graph Coloring
Graph Coloring You are to write a program that tries to find an optimal coloring for a given graph. ...
- jQuery打印Html页面自动分页
最近项目中需要用到打印HTML页面,需要指定区域打印,使用jquery.PrintArea.js 插件 用法: $("div#printmain").printArea(); 但还 ...
- 【剑指offer】递归循环两种方式反转链表
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描写 ...
- Android简单封装类似JQuery异步请求
在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...
- EasyUI基础入门之Pagination(分页)
前言 对于一些企业级的应用来说(非站点),页面上最为基本的内容也就是表格和form了.对于类似于ERP这类系统来说数据记录比較大,前端表格展示的时候必需得实现分页功能了.恰巧EasyUI就提供了分页组 ...
- iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果
8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...