Mr.Panda and TubeMaster Gym - 101194J (二分染色有源汇上下界最大费用流)
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 (二分染色有源汇上下界最大费用流)相关推荐
- BZOJ2406矩阵——有上下界的可行流+二分答案
题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...
- C - Mr. Panda and Strips Gym - 101194C(思维//尺取//2016 icpc china final)
VJ地址 题意:选择一段or两段连续的区间,合成一段序列,使得选择的序列中没有相同的数字,求序列最长的长度 思路:由于是区间内不能有相同的数字,所以考虑用尺取,可以2*n的时间枚举第一段的长度,然后剩 ...
- 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 ...
- CF-85E.Guard Towers(二分+染色)
CF-85E.Guard Towers(二分+染色) 题目链接 题意 nnn个灯塔分成2分,求出最小的曼哈顿距离和其方案树 题意 二分+染色 二分枚举最小值midmidmid,判断能否将nnn个灯塔分 ...
- 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 ...
- UVA 10004 Bicoloring (二分染色)
题目链接:https://vjudge.net/problem/UVA-10004 题意:给你一个连通图,问能否将每个节点染成两种颜色之一,使得每条边两边的节点颜色不同. (本质就是二分图的判定,有个 ...
- bzoj1728[Usaco2006 Open]Two-Headed Cows 双头牛 二分+染色
题意挺显然的就不说了. 这题我= =丢脸丢大了.. 一开始我觉得这题双头牛的模型有点像网络流,想了想反手给自己一耳光.. 然后觉得二分可做?但是怎么判断啊? dp不可做啊,这个条件要用上的话时间会炸. ...
- [上下界网络流][二分] Bzoj P2406 矩阵
题目描述 输入输出格式 输入格式: 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出格式: 第一行,输出最小的答案: 输入输出样例 输入样例#1: ...
- P4068-[SDOI2016]数字配对【二分,费用流】
正题 题目链接:https://www.luogu.com.cn/problem/P4068 题目大意 nnn种数字,第iii个是aia_iai,有bib_ibi个,价值为ci∗cjc_i*c_j ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Submit: 960 Solved: ...
最新文章
- 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
- eclipse Indigo Helios Galileo几种版本的意思
- 移动互联时代:儿童教育重在内容和应用
- JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
- 解决使用百度UEditor编辑器后移动端图片被拉伸问题
- 终于有人把幸存者偏差讲明白了
- JEECG v2与v3两个版本的区别说明
- 在Android NDK下打印log
- 传参:@RequestParam @RequestBody @PathVariable的作用
- XMindCrack.jar下载
- 湖大计算机考研跟南航比,省三也可以逆袭进入985大学?这49所自主招生高校都收省三!...
- 小学计算机学打字教学教案,小学信息技术《键盘一家》的教学设计
- 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇下)...
- tomcat各版本下载
- Mysql,SQL server中英文翻译对照
- ZW32-12型户外柱上高压真空断路器
- 【API】聊天机器人接口
- Google云计算三大论文中英文版
- gameboy模拟器开发_CoreBoy是使用C#编写的跨平台GameBoy模拟器,甚至可以执行ASCII
- 通达oa精灵的下载步骤_通达OA精灵2016版官方下载_通达OA精灵2016版电脑版_通达OA精灵2016版20161212-华军软件园...