hdu 2686 Matrix && hdu 3367 Matrix Again (最大费用最大流)
Matrix
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1394 Accepted Submission(s): 758
Every time yifenfei should to do is that choose a detour which frome the top left point to the bottom right point and than back to the top left point with the maximal values of sum integers that area of Matrix yifenfei choose. But from the top to the bottom can only choose right and down, from the bottom to the top can only choose left and up. And yifenfei can not pass the same area of the Matrix except the start and end.
Each case first line given the integer n (2<n<30)
Than n lines,each line include n positive integers.(<100)
最大费用最大流,搞了好久= =!
题意:
给出一个n*n的矩阵,求(1,1)到(n,n)的两条不想交不重叠的路径,使经过的点的和最大。
开始想到的是DP,后来发现了可以用多线程DP实现:
参考:http://www.cnblogs.com/jackge/archive/2013/04/17/3025628.html
让两个进程同时进行,枚举步数K,当x1==x2||y1==y2时跳过,得状态转移方程:
dp(k, x1, y1, x2, y2) = max(dp(k-1, x1-1, y1, x2-1, y2), dp(k-1, x1-1, y1, x2, y2-1), dp(k-1, x1, y1-1, x2-1, y2), dp(k-1, x1, y1-1,x2, y2-1))
+ data(x1, y1) + data(x2, y2) ;
由于只能走右或下,所以坐标满足x+y=k。这样就能降低维数为3维,方程:
dp(k, x1, x2) = max(dp(k-1, x1, x2), dp(k-1, x1-1, x2), dp(k-1, x1, x2-1), dp(k-1, x1-1, x2-1)) + data(x1, k-x1) + data(x2, k-x2) ;
code:
//31MS 1196K 880 B G++
#include<stdio.h>
#include<string.h>
#define N 50
int p[N][N];
int dp[*N][N][N];
int max(int a,int b)
{
return a>b?a:b;
}
int Max(int a,int b,int c,int d)
{
return max(a,max(b,max(c,d)));
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)
for(int j=;j<n;j++)
scanf("%d",&p[i][j]);
for(int k=;k<*n-;k++)
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(i==j) continue;
dp[k][i][j]=Max(dp[k-][i][j],dp[k-][i-][j],dp[k-][i][j-],dp[k-][i-][j-]);
dp[k][i][j]+=p[i][k-i]+p[j][k-j];
}
int ans=max(dp[*n-][n-][n-],dp[*n-][n-][n-])+p[][]+p[n-][n-];
printf("%d\n",ans);
}
return ;
}
先拆点构图,每个点一分为二,保证了只经过一次,其实网络流的方法就已经解决了这个问题,其次构图时注意把数变为负数,求最小费用最大流。
其实构好图后就是直接套模板了,所以构图的时候注意点,处理一下(1,1)和(n,n)两个点,因为会经过两次。
code:
//31MS 384K 2396 B G++
#include<stdio.h>
#include<string.h>
#include<queue>
#define N 2005
#define inf 0x7ffffff
using namespace std;
struct node{
int u,v,c,w;
int next;
}edge[*N];
int vis[N];
int Head[N],d[N],edgenum;
int pre[N],path[N];
void addedge(int u,int v,int c,int w)
{
edge[edgenum].u=u;
edge[edgenum].v=v;
edge[edgenum].c=c;
edge[edgenum].w=w;
edge[edgenum].next=Head[u];
Head[u]=edgenum++; edge[edgenum].u=v;
edge[edgenum].v=u;
edge[edgenum].c=;
edge[edgenum].w=-w;
edge[edgenum].next=Head[v];
Head[v]=edgenum++;
}
int SPFA(int s,int e)
{
memset(vis,,sizeof(vis));
memset(pre,-,sizeof(pre));
for(int i=;i<=e;i++)
d[i]=inf;
queue<int>Q;
d[s]=;
vis[s]=;
Q.push(s);
while(!Q.empty()){
int u=Q.front();
Q.pop();
vis[u]=; //这里WA了好多次
for(int i=Head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
int w=edge[i].w;
if(edge[i].c> && d[v]>d[u]+w){
pre[v]=u;
path[v]=i;
d[v]=d[u]+w;
if(!vis[v]){
vis[v]=;
Q.push(v);
}
}
}
}
if(pre[e]!=-) return ;
return ;
}
int cost_min_flow(int s,int e)
{
int cost=;
while(SPFA(s,e)){
int minc=inf;
for(int i=e;i!=s;i=pre[i]){
minc=minc<edge[path[i]].c?minc:edge[path[i]].c;
}
for(int i=e;i!=s;i=pre[i]){
edge[path[i]].c-=minc;
edge[path[i]^].c+=minc;
cost+=minc*edge[path[i]].w;
}
}
return cost;
}
int main(void)
{
int n;
int p[][];
while(scanf("%d",&n)!=EOF)
{
edgenum=;
memset(Head,-,sizeof(Head));
int k=n*n;
int s=,e=*k+;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
scanf("%d",&p[i][j]);
addedge(j+(i-)*n,k+j+(i-)*n,,-p[i][j]);
if(j!=n) addedge(k+j+(i-)*n,j++(i-)*n,,);
if(i!=n) addedge(k+j+(i-)*n,j+i*n,,);
}
addedge(s,,,);
addedge(,k+,,);
addedge(*k,e,,);
addedge(k,*k,,);
printf("%d\n",-cost_min_flow(s,e));
}
return ;
}
hdu 2686 Matrix && hdu 3367 Matrix Again (最大费用最大流)的更多相关文章
- HDU 6118 度度熊的交易计划 最大费用可行流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要 ...
- HDU 3395 Special Fish(拆点+最大费用最大流)
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选 ...
- HDU 6118 度度熊的交易计划(最小费用最大流)
Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...
- HDU 3435 A new Graph Game(最小费用最大流)&HDU 3488
A new Graph Game Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
- HDU 2686 Matrix 3376 Matrix Again(费用流)
HDU 2686 Matrix 题目链接 3376 Matrix Again 题目链接 题意:这两题是一样的,仅仅是数据范围不一样,都是一个矩阵,从左上角走到右下角在从右下角走到左上角能得到最大价值 ...
- hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Matrix Again(最大费用最大流)
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Tota ...
随机推荐
- Java Dictionary Example
Dictionary class is the abstract class which is parent of any class which uses the key and value pai ...
- python字符串格式化符号及转移字符含义
博文出自鱼C论坛文章 http://bbs.fishc.com/thread-39140-1-1.html
- GDAL中GDALDataset::RasterIO分块读取的实现
GDALDataset类中的RasterIO函数能够对图像任意指定区域.任意波段的数据按指定数据类型.指定排列方式读入内存和写入文件中,因此可以实现对大影像的分块读.写运算操作.针对特大的影像图像,有 ...
- javasript 字符串 数组操作
Javascript中经常涉及到对字符串和数组的处理,今天总结一下具体的用法 一 操作字符串 String对象有很多函数,可以以不同的方式访问和操作字符串,具体方法如下: charAt(index ...
- ShimmerTextView
本文来自网易云社区 作者:孙有军 产品中有一个需求,要求TextView的文字有一个高亮的效果,高亮的同时有跑马灯效果! 本来想在网上找一个现成的用用,比如Facebook出的Shimmer,还有很多 ...
- ADO.NET基础学习-----四种模型,防止SQL注入
1.ExcuteNonQuery 执行非查询语句,返回受影响的行数. // 1.ExcuteNonQuery string sqlconn = "Data Source=wss;Initia ...
- [CF294B]Shaass and Bookshelf
问题描述 Shaass拥有n本书.他想为他的所有书制作一个书架,并想让书架的长宽尽量小.第i本书的厚度是t[i],且这本书的纸张宽度是w[i].书的厚度是1或2,所有书都有同样的高度(即书架的高是均匀 ...
- JS原型链与继承别再被问倒了
原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...
- python基本数据类型——元组
元组 元组是一种不可变的序列,创建后不可以修改元素值 # 创建只包含一个元素的元组 >>a = (3,) >>print(a) (3,) #使用 tuple() 转换为元组 & ...
- halcon安装提示could not write updated path to HKLM
halcon安装提示could not write updated path to HKLM 我们在安装Halcon软件时,会弹出如上图错误信息,这个错误信息提示软件无法写入本地注册表,造成这个原因有 ...