题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36707

思路:根据题意拆点建图即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define MAXN 2222
  8. #define inf 1<<30
  9.  
  10. struct Edge{
  11. int v,cap,next;
  12. }edge[MAXN*MAXN];
  13.  
  14. int n,m,p,NE,NV,vs,vt;
  15. int head[MAXN];
  16.  
  17. void Insert(int u,int v,int cap)
  18. {
  19. edge[NE].v=v;
  20. edge[NE].cap=cap;
  21. edge[NE].next=head[u];
  22. head[u]=NE++;
  23.  
  24. edge[NE].v=u;
  25. edge[NE].cap=;
  26. edge[NE].next=head[v];
  27. head[v]=NE++;
  28. }
  29.  
  30. int level[MAXN],gap[MAXN];
  31. void bfs(int vt)
  32. {
  33. memset(level,-,sizeof(level));
  34. memset(gap,,sizeof(gap));
  35. level[vt]=;
  36. gap[]++;
  37. queue<int>que;
  38. que.push(vt);
  39. while(!que.empty()){
  40. int u=que.front();
  41. que.pop();
  42. for(int i=head[u];i!=-;i=edge[i].next){
  43. int v=edge[i].v;
  44. if(level[v]!=-)continue;
  45. level[v]=level[u]+;
  46. gap[level[v]]++;
  47. que.push(v);
  48. }
  49. }
  50. }
  51.  
  52. int cur[MAXN],pre[MAXN];
  53. int SAP(int vs,int vt)
  54. {
  55. bfs(vt);
  56. memset(pre,-,sizeof(pre));
  57. memcpy(cur,head,sizeof(head));
  58. int u=pre[vs]=vs,aug=inf,maxflow=;
  59. gap[]=NV;
  60. while(level[vs]<NV){
  61. bool flag=false;
  62. for(int &i=cur[u];i!=-;i=edge[i].next){
  63. int v=edge[i].v;
  64. if(edge[i].cap>&&level[u]==level[v]+){
  65. flag=true;
  66. aug=min(aug,edge[i].cap);
  67. pre[v]=u;
  68. u=v;
  69. if(v==vt){
  70. maxflow+=aug;
  71. for(u=pre[u];v!=vs;v=u,u=pre[u]){
  72. edge[cur[u]].cap-=aug;
  73. edge[cur[u]^].cap+=aug;
  74. }
  75. aug=inf;
  76. }
  77. break;
  78. }
  79. }
  80. if(flag)continue;
  81. int minlevel=NV;
  82. for(int i=head[u];i!=-;i=edge[i].next){
  83. int v=edge[i].v;
  84. if(edge[i].cap>&&level[v]<minlevel){
  85. minlevel=level[v];
  86. cur[u]=i;
  87. }
  88. }
  89. if(--gap[level[u]]==)break;
  90. level[u]=minlevel+;
  91. gap[level[u]]++;
  92. u=pre[u];
  93. }
  94. return maxflow;
  95. }
  96.  
  97. char map[][];
  98. int dir[][]={{-,},{,},{,-},{,}};
  99.  
  100. int main()
  101. {
  102. while(~scanf("%d%d%d",&n,&m,&p)){
  103. for(int i=;i<n;i++)scanf("%s",map[i]);
  104. NE=;
  105. vs=,vt=*n*m+,NV=*n*m+;
  106. memset(head,-,sizeof(head));
  107. for(int i=;i<n;i++){
  108. for(int j=;j<m;j++){
  109. if(map[i][j]=='~')continue;
  110. for(int k=;k<;k++){
  111. int x=i+dir[k][],y=j+dir[k][];
  112. if(x<||x>=n||y<||y>=m)continue;
  113. Insert(i*m+j++n*m,x*m+y+,inf);
  114. }
  115. if(map[i][j]=='*'){
  116. Insert(vs,i*m+j+,);
  117. Insert(i*m+j+,i*m+j++n*m,);
  118. }
  119. else if(map[i][j]=='.')Insert(i*m+j+,i*m+j++n*m,);
  120. else if(map[i][j]=='@')Insert(i*m+j+,i*m+j++n*m,inf);
  121. else if(map[i][j]=='#')Insert(i*m+j+,i*m+j++n*m,inf),Insert(i*m+j++n*m,vt,p);
  122. }
  123. }
  124. printf("%d\n",SAP(vs,vt));
  125. }
  126. return ;
  127. }

uva 11380(最大流+拆点)的更多相关文章

  1. poj 3498 March of the Penguins(最大流+拆点)

    题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...

  2. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  3. UVa 1658 - Admiral(最小费用最大流 + 拆点)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVa 10330 - Power Transmission(最大流--拆点)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  6. BZOJ-1877 晨跑 最小费用最大流+拆点

    其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...

  7. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  8. hdu 4289 最大流拆点

    大致题意:     给出一个又n个点,m条边组成的无向图.给出两个点s,t.对于图中的每个点,去掉这个点都需要一定的花费.求至少多少花费才能使得s和t之间不连通. 大致思路:     最基础的拆点最大 ...

  9. uva 10330 最大流

    拆点  将节点 i 的容量拆成从 i 到 i+n 的边的容量 套用最大流模板 ac #include <cstdio> #include <cstdlib> #include ...

随机推荐

  1. C++编程思想重点笔记(上)

    C和C++指针的最重要的区别在于:C++是一种类型要求更强的语言.就void *而言,这一点表现得更加突出.C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void *来实现.例如: b ...

  2. 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 ...

  3. 磁盘 I/O 性能监控指标和调优方法

    在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能.磁盘 I/O 性能监控的指标主要包括:指标 1:每秒 I/O 数(IOPS 或 tps ...

  4. java笔记--关于线程死锁

    关于线程死锁 什么是死锁: 在编写多线程的时候,必须要注意资源的使用问题,如果两个或多个线程分别拥有不同的资源, 而同时又需要对方释放资源才能继续运行时,就会发生死锁. 简单来说:死锁就是当一个或多个 ...

  5. [Effective JavaScript笔记]第1条:了解使用的js版本

    1997年 正式成为国际标准,官方名称为ECMAScript. 1999年 定稿第3版ECMAScript标准(简称ES3),最广泛的js版本. 2009年 发布第5版即ES5,引入了一些新特性,标准 ...

  6. 不同版本的name可以重复

    - validates :name, presence: true, uniqueness: { conditions: -> { where(:state.ne => 2) } }, l ...

  7. mac os 安装 pkg-config

    wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.tar.gz . env LDFLAGS="-framework ...

  8. [BZOJ3670][UOJ#5][NOI2014]动物园

    [BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...

  9. [ruby on rails] 跟我学之(8)修改数据

    修改views 修改index视图(app/views/posts/index.html.erb),添加编辑链接,如下: <h1>Our blogs</h1> <% @p ...

  10. Android中获取IMSI和IMEI

    TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Str ...