【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了。
这是多校的1002; 最小费用最大流。
题目大意:
有n*m个方格,每一个方格都一个的十进制一位的数。你能够操作K次。
对于每一次操作,你能够选择一个出发点向下或向右Jump。跳的花费是|x1-x2|+|y1-y2|-1的能量 。假设你跳的这两个位置上数字同样,那么你就会获得数字表示的能量值。
对于每一次操作,你能够这样跳随意次 ,可是每一个位置仅仅能经过一次在这K次操作中。
初始能量值是0,当操作完毕后,假设n*m个方格没有都经过过,输出“-1”,否则输出能够得到的最大能量值。
解题思路:
建立一个流量网络,一个二部图。X部分向Y部分链接的情况表示能够从一个点跳到还有一个点,超级源点和超级汇点分别同X部分的点和Y部分的点链接。在X部分中多加一个点它与源点的流量是K费用是0,与Y部分全部点链接流量是1费用是0。这表示操作K次。
以下是代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#define clear(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))
#define clearall(A, X) memset(A, X, sizeof(A))
#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))
#define memcopy1all(A, X) memcpy(A , X ,sizeof(X))
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) using namespace std; struct node
{
int u,v,c,f,next;
} edge[21000];
char s[12][15];
const int inf=1<<30;
int head[210],cnt,dis[210],pre[210],n,m,cost,flow;
bool vis[210];
bool spfa()
{
int i,u;
clearall(pre,-1);
clearall(dis,0x3f3f3f);
clearall(vis,false);
queue <int>q;
dis[n*m*2]=0;
vis[n*m*2]=true;
q.push(n*m*2);
while(!q.empty())
{
u=q.front();
q.pop();
i=head[u];
vis[u]=false;
while(i!=-1)
{
if(edge[i].f>0&&dis[edge[i].v]>dis[u]+edge[i].c)
{
dis[edge[i].v]=dis[u]+edge[i].c;
pre[edge[i].v]=i;
if(!vis[edge[i].v])
{
vis[edge[i].v]=true;
q.push(edge[i].v);
}
}
i=edge[i].next;
}
}
if(pre[2*n*m+1]==-1)return false;
else return true;
}
void does()
{
cost=0;
flow=0;
while(spfa())
{
int max1=inf;
int p=pre[2*n*m+1];
while(p!=-1)
{
max1=min(max1,edge[p].f);
p=pre[edge[p].u];
}
p=pre[2*n*m+1];
while(p!=-1)
{
edge[p].f-=max1;
edge[p^1].f+=max1;
cost+=max1*edge[p].c;
p=pre[edge[p].u];
}
flow+=max1;
}
}
void addedge(int u,int v,int f,int c)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].f=f;
edge[cnt].c=c;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].u=v;
edge[cnt].v=u;
edge[cnt].f=0;
edge[cnt].c=-c;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int main()
{
int T,k,case1=1,u,v,f,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<n; i++)
{
scanf("%s",s[i]);
}
clearall(head,-1);
cnt=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
u=i*m+j;
for(int k=j+1; k<m; k++) //right
{
v=i*m+k+n*m;
c=k-j-1;
c=-c;
if(s[i][j]==s[i][k])c+=s[i][j]-'0';
addedge(u,v,1,-c);
}
for(int k=i+1; k<n; k++) //down
{
v=k*m+j+n*m;
c=k-i-1;
c=-c;
if(s[i][j]==s[k][j])c+=s[i][j]-'0';
addedge(u,v,1,-c);
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
addedge(2*n*m,i*m+j,1,0);
addedge(i*m+j+n*m,2*n*m+1,1,0);
addedge(2*n*m+2,i*m+j+n*m,1,0);
}
}
addedge(2*n*m,2*n*m+2,k,0);
does();
printf("Case %d : ",case1++);
if(flow!=n*m)puts("-1");
else printf("%d\n",-cost);
}
return 0;
}
【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump的更多相关文章
- HDU 2018 Multi-University Training Contest 1  Triangle Partition 【YY】
		
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6300 Triangle Partition Time Limit: 2000/1000 MS (Java ...
 - hdu 4864 Task---2014 Multi-University Training Contest 1
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS (Java/Others) M ...
 - 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】
		
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...
 - HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)
		
2018 Multi-University Training Contest 5 6351.Beautiful Now 题意就是交换任意两个数字,问你交换k次之后的最小值和最大值. 官方题解: 哇塞, ...
 - HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))
		
2018 Multi-University Training Contest 4 6333.Problem B. Harvest of Apples 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...
 - HDU 6395 2018 Multi-University Training Contest 7 (快速幂+分块)
		
原题地址 Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
 - 【2014 Multi-University Training Contest 3 1002】/【HDU 4888】  Redraw Beautiful Drawings
		
不easy啊.最终能够补第二个题了.! 顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错) 题目大意: 有一个n*m的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...
 - 【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
		
果然,或滥用零件,啥都不说了.我们欣慰地学习阅读.这两天残疾儿童是数学. 这是求所需的问题,不明确.贴上官方的解题报告. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...
 - hdu 5755 2016 Multi-University Training Contest 3 Gambler Bo 高斯消元模3同余方程
		
http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意:一个N*M的矩阵,改变一个格子,本身+2,四周+1.同时mod 3;问操作多少次,矩阵变为全0.输出 ...
 
随机推荐
- asp.net资料! (.NET) (ASP.NET)
			
使用SqlBulkCopy类加载其他源数据到SQL表 在数据回发时,维护ASP.NET Tree控件的位置 vagerent的vs2005网站开发技巧 ASP.NET2.0小技巧--内部控件权限的实现 ...
 - POJ 2886 Who Gets the Most Candies?  线段树
			
题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...
 - Swift开发之 ---- Swift宏定义
			
swift中没有了#Define这种宏定义了,可以用let来声明常量来取代,判断当前系统版本 let IS_IOS7 = (UIDevice.currentDevice().systemVersion ...
 - java项目打成jar包时引用了第三方jar,此时我们该如何解决呢
			
Web项目做多了,反而对单纯的java项目陌生了,今天我们在开发项目的过程中,碰到一个这样的需求:需要将java项目放到linux系统上跑起来,当然这个javaSE项目是带main方法的.我们知道在I ...
 - [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
			
题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...
 - Hibernate 注解 动态插入( DynamicInsert) 动态更新(DynamicUpdate)
			
@DynamicUpdate(value = true)@DynamicInsert(value = true) 这两个注解默认是false,经试验,如果使用了这两个注解,在一定程度上是可以提高插入和 ...
 - SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-006-当构造函数有集合时的注入
			
一.当构造函数有集合时,只能用<CONSTRUCTOR-ARG>,不能用C-NAMESPACE 二. 1. package soundsystem.collections; import ...
 - Listview 异步加载图片之优化篇(有图有码有解释)
			
在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...
 - Learning WCF 书中的代码示例下载地址
			
Learning WCF Download Example Code 第一个压缩文件LearningWCF.zip是VS2005创建的项目,不要下载这个. 建议下载VS2008版的,以及Media
 - C++ const&的一个特性
			
最近在搜索类似scope exit的实现时,除了发现已经有人向标准委员会提出意见,还得到一些意外的C++特性,这个特性一直都存在,而且很有趣 http://herbsutter.com/2008/01 ...