Mr.Panda and TubeMaster

Gym - 101194J

题目链接就这样了,题面难得获得就算了。

题目大意:

给出一面方格纸,上面布满了方格,方格中能且只能如下图部署水管:

每两个方格之间连接具有一定的收益,问在满足所有的水管成环,且一些水管必须经过的前提下可以获得的最大收益是多少。

思路:

很容易感觉出来,这应该是一个费用流问题。但是显然得,解决起来并不简单。

首先,我们为方格进行染色,使得一些方格只能横向出纵向入,而他们相邻的方格只能纵向出横向入,这样就可以保证任意环内的流向是一致的,再接着对不是必须经过的点连上一条费用为0的边,这样就保证这些点必然可以经过,因为他们并不占用额外的流量,假如流量不等于方格的总数,则必然是那些必须经过的点没有被经过。最终跑一遍费用流即可

AC代码:

#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
const int maxn=2005;
const int INF=0x3f3f3f3f;
struct Edge{int from,to,cap,flow,cost;Edge(){}Edge(int from,int to,int cap,int flow,int cost):from(from),to(to),cap(cap),flow(flow),cost(cost){}
};
struct MCMF
{int n,m,s,t;vector<Edge> edges;vector<int> g[maxn];int inq[maxn];int d[maxn];int p[maxn];int a[maxn];void init(int n){this->n =n;for(int i=0; i<n; i++)g[i].clear();edges.clear();}void AddEdge(int from,int to,int cap,int cost){Edge e1= Edge(from,to,cap,0,cost), e2= Edge(to,from,0,0,-cost);edges.push_back(e1);edges.push_back(e2);m=edges.size();g[from].push_back(m-2);g[to].push_back(m-1);}bool spfa(int s,int t, int & flow,int & cost){for(int i=0; i<=n; i++)d[i]=INF;memset(inq,0,sizeof(inq));d[s]=0;inq[s]=1;p[s]=0;a[s]=INF;queue<int>q;q.push(s);while(!q.empty()){int u=q.front();q.pop();inq[u]=0;for(int i=0; i<g[u].size(); i++){Edge & e = edges[g[u][i]];if(e.cap>e.flow && d[e.to]>d[u]+e.cost){d[e.to]=d[u]+e.cost;p[e.to]=g[u][i];a[e.to]=min(a[u],e.cap-e.flow);if(!inq[e.to]){q.push(e.to);inq[e.to]=1;}}}}if(d[t]==INF)return false;flow+=a[t];cost+=a[t]*d[t];for(int u=t; u!=s; u=edges[p[u]].from){edges[p[u]].flow +=a[t];edges[p[u]^1].flow-=a[t];}return true;}pair<int,int>  Mincost(int s,int t){int flow=0,cost =0;while(spfa(s,t,flow,cost));return pair<int,int>(cost,flow);}
};
int idl[35][35],idr[35][35];
int valr[35][35],valc[35][35];
int vis[35][35];
int main()
{int t;int kace=1;scanf("%d",&t);while(t--){memset(vis,0,sizeof(vis));int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<m;j++){scanf("%d",&valc[i][j]);}}for(int i=1;i<n;i++){for(int j=1;j<=m;j++){scanf("%d",&valr[i][j]);}}MCMF pro;int cnt=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){idl[i][j]=++cnt;idr[i][j]=++cnt;}}pro.init(cnt+10);int ss=0,tt=cnt+1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if((i+j)&1){if(j+1<=m)  pro.AddEdge(idl[i][j],idr[i][j+1],1,-valc[i][j]);if(j-1>=1)  pro.AddEdge(idl[i][j],idr[i][j-1],1,-valc[i][j-1]);}else{if(i+1<=n)  pro.AddEdge(idl[i][j],idr[i+1][j],1,-valr[i][j]);if(i-1>=1)  pro.AddEdge(idl[i][j],idr[i-1][j],1,-valr[i-1][j]);}}}int k;scanf("%d",&k);while(k--){int x,y;scanf("%d%d",&x,&y);vis[x][y]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){pro.AddEdge(ss,idl[i][j],1,0);pro.AddEdge(idr[i][j],tt,1,0);if(!vis[i][j])pro.AddEdge(idl[i][j],idr[i][j],1,0);}}printf("Case #%d: ",kace++);pair<int,int> ans=pro.Mincost(ss,tt);if(ans.second!=n*m) printf("Impossible\n");else printf("%d\n",-ans.first);}
}

转载于:https://www.cnblogs.com/fly-white/p/10092697.html

Mr.Panda and TubeMaster Gym - 101194J (二分染色有源汇上下界最大费用流)相关推荐

  1. BZOJ2406矩阵——有上下界的可行流+二分答案

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  2. C - Mr. Panda and Strips Gym - 101194C(思维//尺取//2016 icpc china final)

    VJ地址 题意:选择一段or两段连续的区间,合成一段序列,使得选择的序列中没有相同的数字,求序列最长的长度 思路:由于是区间内不能有相同的数字,所以考虑用尺取,可以2*n的时间枚举第一段的长度,然后剩 ...

  3. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)

    题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...

  4. CF-85E.Guard Towers(二分+染色)

    CF-85E.Guard Towers(二分+染色) 题目链接 题意 nnn个灯塔分成2分,求出最小的曼哈顿距离和其方案树 题意 二分+染色 二分枚举最小值midmidmid,判断能否将nnn个灯塔分 ...

  5. Mr. Panda and Kakin(拓展欧几里得 + O(1)快速乘)

    Mr. Panda and Kakin 给定n,cn, cn,c,要我们找到nnn是两个相邻质数的乘积,要我们找到xxx,满足x230+3≡c(modn)x ^{2 ^{30} + 3} \equiv ...

  6. UVA 10004 Bicoloring (二分染色)

    题目链接:https://vjudge.net/problem/UVA-10004 题意:给你一个连通图,问能否将每个节点染成两种颜色之一,使得每条边两边的节点颜色不同. (本质就是二分图的判定,有个 ...

  7. bzoj1728[Usaco2006 Open]Two-Headed Cows 双头牛 二分+染色

    题意挺显然的就不说了. 这题我= =丢脸丢大了.. 一开始我觉得这题双头牛的模型有点像网络流,想了想反手给自己一耳光.. 然后觉得二分可做?但是怎么判断啊? dp不可做啊,这个条件要用上的话时间会炸. ...

  8. [上下界网络流][二分] Bzoj P2406 矩阵

    题目描述 输入输出格式 输入格式: 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出格式: 第一行,输出最小的答案: 输入输出样例 输入样例#1: ...

  9. P4068-[SDOI2016]数字配对【二分,费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P4068 题目大意 nnn种数字,第iii个是aia_iai​,有bib_ibi​个,价值为ci∗cjc_i*c_j ...

  10. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 960  Solved:  ...

最新文章

  1. 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
  2. eclipse Indigo Helios Galileo几种版本的意思
  3. 移动互联时代:儿童教育重在内容和应用
  4. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
  5. 解决使用百度UEditor编辑器后移动端图片被拉伸问题
  6. 终于有人把幸存者偏差讲明白了
  7. JEECG v2与v3两个版本的区别说明
  8. 在Android NDK下打印log
  9. 传参:@RequestParam @RequestBody @PathVariable的作用
  10. XMindCrack.jar下载
  11. 湖大计算机考研跟南航比,省三也可以逆袭进入985大学?这49所自主招生高校都收省三!...
  12. 小学计算机学打字教学教案,小学信息技术《键盘一家》的教学设计
  13. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇下)...
  14. tomcat各版本下载
  15. Mysql,SQL server中英文翻译对照
  16. ZW32-12型户外柱上高压真空断路器
  17. 【API】聊天机器人接口
  18. Google云计算三大论文中英文版
  19. gameboy模拟器开发_CoreBoy是使用C#编写的跨平台GameBoy模拟器,甚至可以执行ASCII
  20. 通达oa精灵的下载步骤_通达OA精灵2016版官方下载_通达OA精灵2016版电脑版_通达OA精灵2016版20161212-华军软件园...

热门文章

  1. 页面加载速度优化的建议
  2. VS2013用InstallShield生成安装包文件步骤
  3. HDU 1712 ACboy needs your help(分组背包入门题)
  4. 用位运算实现内存对齐
  5. 骨骼动画编辑器Spine的纹理打包器(texture packer)
  6. VmBox硬盘容量调整
  7. Solaris11修改主机名
  8. WordPress Cart66 Lite插件跨站请求伪造漏洞
  9. oracle一步一步01
  10. python opencv 鼠标提取矩形(Rectangle)ROI