题目:hdoj 3376 Matrix Again

题意:给出一个m*n的矩阵,然后从左上角到右下角走两次,每次仅仅能向右或者向下,出了末尾点其它仅仅能走一次,不能交叉,每次走到一个格子拿走这个格子中的数字,求价值最大?

分析:非常明显费用流。開始想的到一种建图方案,可是那样的话流量全为负值的话会成一个环,所以果断换了。

建图方案是:

首先拆点,每一个点拆成两个i 和 ii ,建边,费用为当前格子的值,流量为1,初始点和末尾点为2

然后每一个点向它的右边和下边分别建边,容量为1,费用为0

s 连接 左上角 流量 2 ,费用 0

右下角连接 t 。流量为 2 。费用为 0

PS:这个题目居然卡vector,的模拟自己实现邻接表,否则的话会超内存。

ac代码:

#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;#define PB push_back
#define MP make_pair
#define Del(a,b) memset(a,b,sizeof(a))typedef vector<int> VI;
typedef long long LL;
const LL inf = 0x3f3f3f3f;
const int N = 750000;
int cost,flow;
struct Node
{int from,to,cap,flow,cost;int next;
}e[N<<2];
int head[N],top;
void add_Node(int from,int to,int cap,int cost)
{e[top] = ((Node){from,to,cap,0,cost,head[from]});head[from] = top++;e[top] = ((Node){to,from,0,0,-cost,head[to]});head[to] = top++;
}
int vis[N],dis[N];
int father[N],pos[N];
bool BellManford(int s,int t,int& flow,int& cost)
{Del(dis,inf);Del(vis,0);queue<int> q;q.push(s);vis[s]=1;father[s]=-1;dis[s] = 0;pos[s] = inf;while(!q.empty()){int f = q.front();q.pop();vis[f] = 0;for(int i = head[f];i!=-1 ; i = e[i].next){Node& tmp = e[i];if(tmp.cap>tmp.flow && dis[tmp.to] > dis[f] + tmp.cost){dis[tmp.to] = dis[f] + tmp.cost;father[tmp.to] = i;pos[tmp.to] = min(pos[f],tmp.cap - tmp.flow);if(vis[tmp.to] == 0){vis[tmp.to]=1;q.push(tmp.to);}}}}if(dis[t] == inf)return false;flow += pos[t];cost += dis[t]*pos[t];for(int u = t; u!=s ; u = e[father[u]].from){e[father[u]].flow += pos[t];e[father[u]^1].flow -= pos[t];}return true;
}
int Mincost(int s,int t)
{flow = 0, cost = 0;while(BellManford(s,t,flow,cost));return cost;
}
int main()
{int n;while(~scanf("%d",&n)){Del(head,-1);top = 0;int num = n*n;int one,x;for(int i=0;i<n;i++)for(int j=0;j<n;j++){scanf("%d",&x);if(i==0 && j==0)one = x;int tmp = 1;if(i==0 && j==0 || i==n-1 && j == n-1)tmp = 2;add_Node(i*n+j,i*n+j+num,tmp,-x);}for(int i=0;i<n;i++){for(int j=0;j<n;j++){if((j+1)<n)add_Node(i*n+j+num,i*n+j+1,1,0);if((i+1)<n)add_Node(i*n+j+num,(i+1)*n+j,1,0);}}int s = 2*num+1 , t = s + 1;add_Node(s,0,2,0);add_Node(num+num-1,t,2,0);int ans = Mincost(s,t);printf("%d\n",-ans-x-one);}return 0;
}

转载于:https://www.cnblogs.com/brucemengbm/p/6924227.html

hdoj 3376,2686 Matrix Again 【最小费用最大流】相关推荐

  1. poj 3422 Kaka's Matrix Travels(最小费用最大流)

    题目链接 Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9394   Accep ...

  2. poj3422 Kaka's Matrix Travels(最小费用最大流问题)

    1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...

  3. 2018ACM上海大都会赛: I. Matrix Game(最小费用最大流)

    题目描述 At the start of the matrix game, we have an N x M matrix. Each grid has some balls. The grid in ...

  4. hdu Kaka's Matrix Travels(最小费用最大流)

    把题意写一下:  给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...

  5. poj 2516(最小费用最大流)

    其实题意很明确,最小费用最大流, 但是我这2货就建图就太二了, 我把所有的情况都弄到一个图里面. 总的点数有5000个,加上这么多的边,果断TLE... 后面知道第k个的情况是独立的,所以可以分成K次 ...

  6. 最小费用最大流算法及题集

    貌似网上最小费用最大流的讲解的不多. 所谓最小费用最大流:就是在保证从源点 S 到汇点 T 的流量最大的前提下,使费用最小 这就在原先最大流问题的网络中,给每天边上新加上了费用,求得不在是最大流,而是 ...

  7. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  8. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  9. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

最新文章

  1. asp.net 对xml文件的读写,添加,修改,删除操作
  2. 2019.03.13 ZJOI2019模拟赛 解题报告
  3. Linux数据报文接收发送总结2
  4. NSDictionary和NSMutableDictionary good
  5. python可视化水平双向箭头_python数据可视化第二弹
  6. 懒与馋的平衡:餐饮O2O市场广阔,发展不易
  7. 【路径规划】基于matlab动态多群粒子群算法局部搜索路径规划【含Matlab源码 448期】
  8. QQ群统一规范与守则
  9. 使用nodejs pkg创建exe文件后更改图标
  10. 使用POI提取Word文件的内容(纯文本、带html格式)
  11. 做外贸用哪个企业邮箱比较好?大容量外贸企业邮箱哪家好?
  12. 『现学现忘』Docker相关概念 — 1、云计算概念
  13. 高德地图只显示部分区域
  14. 企业财务管理信息化现状思考与探索
  15. numpy array 增加一列(行)
  16. 使用Vue快速开发单页应用
  17. crispr-cas9基因编辑技术最新进展(2021年1月-2月)
  18. win10任务栏透明—注册表方法【新增半透明】
  19. zuk android os 流量,国产机首发? ZUK Z1或12月推送安卓6.0
  20. 画世界怎么用光影_水彩画中的光与影/世界绘画经典教程

热门文章

  1. 高斯消元解线性方程组(浮点高斯消元模板)
  2. 对接接口文档_产品经理所理解的接口
  3. python | 关键词快速匹配检索小工具 pyahocorasick / ahocorapy
  4. 自动化设计-框架介绍 TestCase
  5. 函数式编程-将Monad(单子)融入Swift
  6. 图解25匹马的选马问题
  7. JAVA基础--toString, equals方法
  8. Linux下自动备份Oracle数据库并删除指定天数前的备份
  9. hdoj_1711_Number Sequence
  10. imreadraw的注册