hdoj 3376,2686 Matrix Again 【最小费用最大流】
题目: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 【最小费用最大流】相关推荐
- poj 3422 Kaka's Matrix Travels(最小费用最大流)
题目链接 Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9394 Accep ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...
- 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 ...
- hdu Kaka's Matrix Travels(最小费用最大流)
把题意写一下: 给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...
- poj 2516(最小费用最大流)
其实题意很明确,最小费用最大流, 但是我这2货就建图就太二了, 我把所有的情况都弄到一个图里面. 总的点数有5000个,加上这么多的边,果断TLE... 后面知道第k个的情况是独立的,所以可以分成K次 ...
- 最小费用最大流算法及题集
貌似网上最小费用最大流的讲解的不多. 所谓最小费用最大流:就是在保证从源点 S 到汇点 T 的流量最大的前提下,使费用最小 这就在原先最大流问题的网络中,给每天边上新加上了费用,求得不在是最大流,而是 ...
- 乌鲁木齐网络赛J题(最小费用最大流模板)
ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报 分类: 网络流(33) 版权声 ...
- POJ - 2516 Minimum Cost 最小费用最大流
题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...
- pku The Windy's KM最小权匹配 or 最小费用最大流
http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...
最新文章
- asp.net 对xml文件的读写,添加,修改,删除操作
- 2019.03.13 ZJOI2019模拟赛 解题报告
- Linux数据报文接收发送总结2
- NSDictionary和NSMutableDictionary good
- python可视化水平双向箭头_python数据可视化第二弹
- 懒与馋的平衡:餐饮O2O市场广阔,发展不易
- 【路径规划】基于matlab动态多群粒子群算法局部搜索路径规划【含Matlab源码 448期】
- QQ群统一规范与守则
- 使用nodejs pkg创建exe文件后更改图标
- 使用POI提取Word文件的内容(纯文本、带html格式)
- 做外贸用哪个企业邮箱比较好?大容量外贸企业邮箱哪家好?
- 『现学现忘』Docker相关概念 — 1、云计算概念
- 高德地图只显示部分区域
- 企业财务管理信息化现状思考与探索
- numpy array 增加一列(行)
- 使用Vue快速开发单页应用
- crispr-cas9基因编辑技术最新进展(2021年1月-2月)
- win10任务栏透明—注册表方法【新增半透明】
- zuk android os 流量,国产机首发? ZUK Z1或12月推送安卓6.0
- 画世界怎么用光影_水彩画中的光与影/世界绘画经典教程