uva 11380(最大流+拆点)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36707
思路:根据题意拆点建图即可。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- using namespace std;
- #define MAXN 2222
- #define inf 1<<30
- struct Edge{
- int v,cap,next;
- }edge[MAXN*MAXN];
- int n,m,p,NE,NV,vs,vt;
- int head[MAXN];
- void Insert(int u,int v,int cap)
- {
- edge[NE].v=v;
- edge[NE].cap=cap;
- edge[NE].next=head[u];
- head[u]=NE++;
- edge[NE].v=u;
- edge[NE].cap=;
- edge[NE].next=head[v];
- head[v]=NE++;
- }
- int level[MAXN],gap[MAXN];
- void bfs(int vt)
- {
- memset(level,-,sizeof(level));
- memset(gap,,sizeof(gap));
- level[vt]=;
- gap[]++;
- queue<int>que;
- que.push(vt);
- while(!que.empty()){
- int u=que.front();
- que.pop();
- for(int i=head[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(level[v]!=-)continue;
- level[v]=level[u]+;
- gap[level[v]]++;
- que.push(v);
- }
- }
- }
- int cur[MAXN],pre[MAXN];
- int SAP(int vs,int vt)
- {
- bfs(vt);
- memset(pre,-,sizeof(pre));
- memcpy(cur,head,sizeof(head));
- int u=pre[vs]=vs,aug=inf,maxflow=;
- gap[]=NV;
- while(level[vs]<NV){
- bool flag=false;
- for(int &i=cur[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap>&&level[u]==level[v]+){
- flag=true;
- aug=min(aug,edge[i].cap);
- pre[v]=u;
- u=v;
- if(v==vt){
- maxflow+=aug;
- for(u=pre[u];v!=vs;v=u,u=pre[u]){
- edge[cur[u]].cap-=aug;
- edge[cur[u]^].cap+=aug;
- }
- aug=inf;
- }
- break;
- }
- }
- if(flag)continue;
- int minlevel=NV;
- for(int i=head[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap>&&level[v]<minlevel){
- minlevel=level[v];
- cur[u]=i;
- }
- }
- if(--gap[level[u]]==)break;
- level[u]=minlevel+;
- gap[level[u]]++;
- u=pre[u];
- }
- return maxflow;
- }
- char map[][];
- int dir[][]={{-,},{,},{,-},{,}};
- int main()
- {
- while(~scanf("%d%d%d",&n,&m,&p)){
- for(int i=;i<n;i++)scanf("%s",map[i]);
- NE=;
- vs=,vt=*n*m+,NV=*n*m+;
- memset(head,-,sizeof(head));
- for(int i=;i<n;i++){
- for(int j=;j<m;j++){
- if(map[i][j]=='~')continue;
- for(int k=;k<;k++){
- int x=i+dir[k][],y=j+dir[k][];
- if(x<||x>=n||y<||y>=m)continue;
- Insert(i*m+j++n*m,x*m+y+,inf);
- }
- if(map[i][j]=='*'){
- Insert(vs,i*m+j+,);
- Insert(i*m+j+,i*m+j++n*m,);
- }
- else if(map[i][j]=='.')Insert(i*m+j+,i*m+j++n*m,);
- else if(map[i][j]=='@')Insert(i*m+j+,i*m+j++n*m,inf);
- else if(map[i][j]=='#')Insert(i*m+j+,i*m+j++n*m,inf),Insert(i*m+j++n*m,vt,p);
- }
- }
- printf("%d\n",SAP(vs,vt));
- }
- return ;
- }
uva 11380(最大流+拆点)的更多相关文章
- poj 3498 March of the Penguins(最大流+拆点)
题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- UVa 1658 - Admiral(最小费用最大流 + 拆点)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 10330 - Power Transmission(最大流--拆点)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- BZOJ-1877 晨跑 最小费用最大流+拆点
其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...
- BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...
- hdu 4289 最大流拆点
大致题意: 给出一个又n个点,m条边组成的无向图.给出两个点s,t.对于图中的每个点,去掉这个点都需要一定的花费.求至少多少花费才能使得s和t之间不连通. 大致思路: 最基础的拆点最大 ...
- uva 10330 最大流
拆点 将节点 i 的容量拆成从 i 到 i+n 的边的容量 套用最大流模板 ac #include <cstdio> #include <cstdlib> #include ...
随机推荐
- C++编程思想重点笔记(上)
C和C++指针的最重要的区别在于:C++是一种类型要求更强的语言.就void *而言,这一点表现得更加突出.C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void *来实现.例如: b ...
- cf.VK CUP 2015.C.Name Quest(贪心)
Name Quest time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- 磁盘 I/O 性能监控指标和调优方法
在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能.磁盘 I/O 性能监控的指标主要包括:指标 1:每秒 I/O 数(IOPS 或 tps ...
- java笔记--关于线程死锁
关于线程死锁 什么是死锁: 在编写多线程的时候,必须要注意资源的使用问题,如果两个或多个线程分别拥有不同的资源, 而同时又需要对方释放资源才能继续运行时,就会发生死锁. 简单来说:死锁就是当一个或多个 ...
- [Effective JavaScript笔记]第1条:了解使用的js版本
1997年 正式成为国际标准,官方名称为ECMAScript. 1999年 定稿第3版ECMAScript标准(简称ES3),最广泛的js版本. 2009年 发布第5版即ES5,引入了一些新特性,标准 ...
- 不同版本的name可以重复
- validates :name, presence: true, uniqueness: { conditions: -> { where(:state.ne => 2) } }, l ...
- mac os 安装 pkg-config
wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.tar.gz . env LDFLAGS="-framework ...
- [BZOJ3670][UOJ#5][NOI2014]动物园
[BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...
- [ruby on rails] 跟我学之(8)修改数据
修改views 修改index视图(app/views/posts/index.html.erb),添加编辑链接,如下: <h1>Our blogs</h1> <% @p ...
- Android中获取IMSI和IMEI
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Str ...