HDU3376 最小费用最大流 模板2
Matrix Again
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)
Total Submission(s): 4255 Accepted Submission(s): 1233
Every time starvae should to do is that choose a detour which from 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 starvae 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 starvae can not pass the same area of the Matrix except the start and end..
Do you know why call this problem as “Matrix Again”? AS it is like the problem 2686 of HDU.
Each case first line given the integer n (2<=n<=600)
Then n lines, each line include n positive integers. (<100)
10 3
5 10
3
10 3 3
2 5 3
6 7 10
5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
46
80
- //和HDU2686一样,只是数据变大了,上一个模板会超内存,这个板不会。
- /***********************最小费用最大流模板2*************************/
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- using namespace std;
- const int maxn=**+;
- const int maxm=*maxn;//!边数要够
- const int inf=0x7fffffff;
- struct Edge
- {
- int to,next,cap,flow,cost;
- }edges[maxm];
- int head[maxn],tol,pre[maxn],dis[maxn];
- bool vis[maxn];
- int N;
- void init(int n)
- {
- N=n;
- tol=;
- memset(head,-,sizeof(head));
- }
- void AddEdge(int u,int v,int cap,int cost)
- {
- edges[tol].to=v;
- edges[tol].cap=cap;
- edges[tol].cost=cost;
- edges[tol].flow=;
- edges[tol].next=head[u];
- head[u]=tol++;
- edges[tol].to=u;
- edges[tol].cap=;
- edges[tol].cost=-cost;
- edges[tol].flow=;
- edges[tol].next=head[v];
- head[v]=tol++;
- }
- bool spfa(int s,int t)
- {
- queue<int>q;
- for(int i=;i<=N;i++){
- dis[i]=inf;
- vis[i]=;
- pre[i]=-;
- }
- dis[s]=;
- vis[s]=;
- q.push(s);
- while(!q.empty()){
- int u=q.front();q.pop();
- vis[u]=;
- for(int i=head[u];i!=-;i=edges[i].next){
- int v=edges[i].to;
- if(edges[i].cap>edges[i].flow&&dis[v]>dis[u]+edges[i].cost){
- dis[v]=dis[u]+edges[i].cost;
- pre[v]=i;
- if(!vis[v]) {vis[v]=;q.push(v);}
- }
- }
- }
- if(pre[t]==-) return ;
- return ;
- }
- int MinCostFlow(int s,int t)
- {
- int flow=,cost=;
- while(spfa(s,t)){
- int Min=inf;
- for(int i=pre[t];i!=-;i=pre[edges[i^].to])
- Min=min(Min,edges[i].cap-edges[i].flow);
- for(int i=pre[t];i!=-;i=pre[edges[i^].to]){
- edges[i].flow+=Min;
- edges[i^].flow-=Min;
- cost+=edges[i].cost*Min;
- }
- flow+=Min;
- }
- return cost;//返回最小费用,flow存最大流
- }
- /*********************************************************************/
- int main()
- {
- int n,mp[][];
- while(scanf("%d",&n)==){
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++) scanf("%d",&mp[i][j]);
- int s=,t=n*n*+;
- init(n*n*+);
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++){
- int id=(i-)*n+j;
- if(id==){
- AddEdge(id,id+n*n,,-mp[i][j]);
- AddEdge(s,id,,);
- }
- else if(id==n*n){
- AddEdge(id,id+n*n,,-mp[i][j]);
- AddEdge(id+n*n,t,,);
- }
- else AddEdge(id,id+n*n,,-mp[i][j]);
- if(i<n) AddEdge(id+n*n,id+n,,);
- if(j<n) AddEdge(id+n*n,id+,,);
- }
- }
- int ans=-(MinCostFlow(s,t)+mp[][]+mp[n][n]);
- printf("%d\n",ans);
- }
- return ;
- }
HDU3376 最小费用最大流 模板2的更多相关文章
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
- 最大流 && 最小费用最大流模板
模板从 这里 搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...
- Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...
- 【网络流#2】hdu 1533 - 最小费用最大流模板题
最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...
- poj 2195 最小费用最大流模板
/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...
- POJ2135 最小费用最大流模板题
练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include ...
- POJ 2135 Farm Tour (最小费用最大流模板)
题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(3)修正
@author: 白袍小道 转载说明原处,爱护劳动 插件同步在GITHUB: DaoZhang_XDZ 说明 1.本篇是接着-----(原) MaterialEditor部- Umat ...
- 自测之Lesson6:文件I/O
题目:区分文件I/O和标准I/O. 区别: ①首先两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区), ...
- Java常用类之Math类
Java 的常用类Math类: java.lang.Math 提供了系列的静态方法用于科学计算,其方法的参数和返回值类型一般为 double 类型. 如: 1. public static final ...
- pfx 证书怎么打开
其实双击就能够自动运行导入向导的 不行的话使用我的办法: 单击开始--运行--里输入mmc 然后单击文件--选择添加删除管理单元--再选择添加--拉动滚动条找到证书一项,点击添加再点击完成(不用做任何 ...
- sql server 带输入输出参数的分页存储过程(效率最高)
create procedure proc_page_withtopmax( @pageIndex int,--页索引 @pageSize int,--每页显示数 @pageCount int out ...
- 基于c++的ostu算法的实现
图像二值化算法是图像处理的基础.一般来说,二值化算法可以分为两个类别:全局二值化和局部二值化.全局二值化是指通过某种算法找到一个全局的阈值T,对图像中坐标为(x,y)的像素值做如下处理: Ostu就是 ...
- ORA-00933 SQL命令未正确结束 INSERT INTO ... SELECT
最近在修改数据库存储过程时,出现了一个ORA-00933错误, 执行的是 INSERT INTO...SELECT 语句,具体语句如下: INSERT INTO BASP_DX.QLR@GT(BDCD ...
- 第20天:京东nav、footer部分制作
一.鼠标的4种状态 cursor:pointer; 鼠标变成小手cursor:default;小白cursor:move;移动cursor:text;文本输入 二.网页布局:1.input.butto ...
- set(gcf,'DoubleBuffer','on')
设置的目的是为了防止在不断循环画动画的时候会产生闪烁的现象,而这样便不会了.在动画的制作比较常用.
- RT-thread内核之线程调度器
一.前言 RT-Thread中提供的线程调度器是基于全抢占式优先级的调度,在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自 ...