题意:

有\(n\)个数\(a_1\cdots a_n\),现要你给出\(k\)个不相交的非降子序列,使得和最大。

思路:

费用流建图,每个点拆点,费用为\(-a[i]\),然后和源点连边,和后面非降的数连边,源点和超级源点连一条容量\(k\)的边,跑费用流。
用\(spfa\)费用流\(TLE\),这里因为不会出现负环,所以用\(Dijkstra\)优化。

代码:

/*******
dijkstra优化费用流模板
*******///不能有负环
#include<functional>    //C++编译需要头文件
typedef pair<int, int> pii;//first保存最短距离,second保存顶点的编号
struct edge {int to, cap, cost, rev; //终点,容量(指残量网络中的),费用,反向边编号edge() {}edge(int to, int _cap, int _cost, int _rev):to(to), cap(_cap), cost(_cost), rev(_rev) {}
};
int V;          //顶点数
int h[maxn];    //顶点的势
int dis[maxn];  //最短距离
int prevv[maxn];//最短路中的父结点
int pree[maxn]; //最短路中的父边
vector<edge> G[maxn];   //图的邻接表void init(int n) {V = n;for(int i = 0; i <= V; ++i) G[i].clear();
}
void addEdge(int from, int to, int cap, int cost){G[from].push_back(edge(to, cap, cost, G[to].size()));G[to].push_back(edge(from, 0, -cost, G[from].size() - 1));
}
int MCMF(int s, int t, int f, int &flow){   //f为最多能流多少int res = 0;for(int i = 0; i < 1 + V; i++) h[i] = 0;while(f){priority_queue<pii, vector<pii>, greater<pii> > q;for(int i = 0; i < 1 + V; i++) dis[i] = INF;dis[s] = 0; q.push(pii(0, s));while(!q.empty()) {pii now = q.top(); q.pop();int v = now.second;if(dis[v] < now.first) continue;for(int i = 0; i < G[v].size(); ++i) {edge &e = G[v][i];if(e.cap > 0 && dis[e.to] > dis[v] + e.cost + h[v] - h[e.to]){dis[e.to] = dis[v] + e.cost + h[v] - h[e.to];prevv[e.to] = v;pree[e.to] = i;q.push(pii(dis[e.to], e.to));}}}if(dis[t] == INF) break;for(int i = 0; i <= V; ++i) h[i] += dis[i];int d = f;for(int v = t; v != s; v = prevv[v]) d = min(d, G[prevv[v]][pree[v]].cap);f -= d; flow += d; res += d * h[t];for(int v = t; v != s; v = prevv[v]) {edge &e = G[prevv[v]][pree[v]];e.cap -= d;G[v][e.rev].cap += d;}}return res;
}
#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<stack>
#include<ctime>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
const int maxn = 5000 + 5;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
using namespace std;//不能有负环
#include<functional>    //C++编译需要头文件
typedef pair<int, int> pii;//first保存最短距离,second保存顶点的编号
struct edge {int to, cap, cost, rev; //终点,容量(指残量网络中的),费用,反向边编号edge() {}edge(int to, int _cap, int _cost, int _rev):to(to), cap(_cap), cost(_cost), rev(_rev) {}
};
int V;          //顶点数
int h[maxn];    //顶点的势
int dis[maxn];  //最短距离
int prevv[maxn];//最短路中的父结点
int pree[maxn]; //最短路中的父边
vector<edge> G[maxn];   //图的邻接表void init(int n) {V = n;for(int i = 0; i <= V; ++i) G[i].clear();
}
void addEdge(int from, int to, int cap, int cost){G[from].push_back(edge(to, cap, cost, G[to].size()));G[to].push_back(edge(from, 0, -cost, G[from].size() - 1));
}
int MCMF(int s, int t, int f, int &flow){   //f为最多能流多少int res = 0;for(int i = 0; i < 1 + V; i++) h[i] = 0;while(f){priority_queue<pii, vector<pii>, greater<pii> > q;for(int i = 0; i < 1 + V; i++) dis[i] = INF;dis[s] = 0; q.push(pii(0, s));while(!q.empty()) {pii now = q.top(); q.pop();int v = now.second;if(dis[v] < now.first) continue;for(int i = 0; i < G[v].size(); ++i) {edge &e = G[v][i];if(e.cap > 0 && dis[e.to] > dis[v] + e.cost + h[v] - h[e.to]){dis[e.to] = dis[v] + e.cost + h[v] - h[e.to];prevv[e.to] = v;pree[e.to] = i;q.push(pii(dis[e.to], e.to));}}}if(dis[t] == INF) break;for(int i = 0; i <= V; ++i) h[i] += dis[i];int d = f;for(int v = t; v != s; v = prevv[v]) d = min(d, G[prevv[v]][pree[v]].cap);f -= d; flow += d; res += d * h[t];for(int v = t; v != s; v = prevv[v]) {edge &e = G[prevv[v]][pree[v]];e.cap -= d;G[v][e.rev].cap += d;}}return res;
}
int a[maxn];
int main(){int T;scanf("%d", &T);while(T--){int n, k;scanf("%d%d", &n, &k);init(n * 2 + 5);int s = n * 2 + 1, e = n * 2 + 2;int ss = n * 2 + 3, se = n * 2 + 4;for(int i = 1; i <= n; i++){scanf("%d", &a[i]);addEdge(i, i + n, 1, -a[i]);addEdge(s, i, 1, 0);addEdge(i + n, e, 1, 0);}for(int i = 1; i <= n; i++){for(int j = i + 1; j <= n; j++){if(a[i] <= a[j])addEdge(i + n, j, 1, 0);}}addEdge(ss, s, k, 0);addEdge(e, se, k, 0);int flow;printf("%d\n", -MCMF(ss, se, INF, flow));}return 0;
}

转载于:https://www.cnblogs.com/KirinSB/p/11294032.html

HDU 6611 K Subsequence(Dijkstra优化费用流 模板)题解相关推荐

  1. HDU Problem - 1533 Going Home(费用流板子题)

    题目链接 Problem Description On a grid map there are n little men and n houses. In each unit time, every ...

  2. 图论 —— 网络流 —— 费用流 —— 基于 Dijkstra 的费用流

    [概述] 在求解费用流时,大多数情况都是使用基于 SPFA 的 MCMF 算法,但有时某些毒瘤题会卡 SPFA,此时就要利用基于 Dijkstra 的费用流来求解. [算法原理] 基于 Dijkstr ...

  3. HDU 4833 Best Financing 一脸费用流的dp

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=4833 题意:中文题不解释... 解题思路: 首先以interest_rates为费用建图跑费用流是比较容易 ...

  4. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  5. BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com ...

  6. 网络流 费用流 模板 ISAP+SPFA+ZKW

    2020年4月20日重新发布.7年前的文章,几年前CSDN改版的时候变成了私密--重新发一下吧. 关于费用流ZKW算法的讲解:从入门到精通: 最小费用流的"zkw算法" 关于Din ...

  7. dinic 最大流费用流模板

    dinic最大流: #include<bits/stdc++.h> #define rep(i,a,b) for(int i = (int)a;i<=(int)b;i++) #def ...

  8. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  9. hdu 4411 Arrest 费用流模板

    题意:警察局在0点,里面有k个警察,要将1-n的贼窝一网打尽,这1+n个点都有距离,且要求抓 i 点的贼前保证已经抓光 比i小的贼.警察们最后要回到0点,问满足抓到所以的贼(题目保证可行)最少走的路之 ...

  10. 2020牛客多校10:Identical Trees(树hash + 树同构 + 费用流模板)

    题意:给出两棵同构的有根树,同构修改点的标号使得两棵树完全一样,至少需要修改多少次. 分析:肯定是将子树和另外一棵的某个子树对应,而两棵子树的问题是一个子问题,显然只有同构的子树才可以对应,这要用到 ...

最新文章

  1. spring boot +QQmail
  2. 【FFmpeg】ffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )
  3. c#如何通过ftp上传文件_定时上传文件到ftp,如何使用工具定时上传文件到ftp
  4. python面向对象(2)—— 继承(3)
  5. 计算机公式or,【转载】 odds、OR和RR的计算公式和实际意义
  6. kafka应用场景Kafka VS Flume
  7. 我的docker随笔7:docker容器与主机之间文件拷贝
  8. 微信小程序实现日历功能(附加签到、迟到、未签的状态显示)
  9. iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
  10. LeetCode简单题目(#225 #226 #231 #232 #234)-5道(栈、队列、树、数字)
  11. python如何安装pipwindows_如何在Windows上使用python 2.6安装pip
  12. 初识Tracepro及基本操作说明
  13. TerraSolid工具试用系列2----TerraScan点云滤波(从点云中提取地面点)备注
  14. 国内Linux各版本占有率,Linux市场占有率知多少?
  15. 网站服务器配置在哪里设置,web服务器配置参数 web服务器建立网站具体步骤
  16. html5按钮超链接一个文本文档,怎么做word文档超链接
  17. 【Hyperledger Fabric】学习笔记2——超级账本介绍
  18. Andrew Ng-ML习题答案1
  19. 全民学霸服务器在维护中需要多久,《全民学霸》学生系统详解,成就学霸之路...
  20. 自动添加Opera搜索串

热门文章

  1. React-Native从搭建环境到 发布 APP 指北
  2. 一加6体验深度测评:一款性价比极高的旗舰
  3. 2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁
  4. AngularJS的 $resource服务 关于CRUD操作
  5. Ubuntu source insight3稳定性
  6. json 生成 json字符串
  7. 一起谈.NET技术,基于Visual Studio 2010 阐述C#4个特性
  8. 用JS让文章内容指定的关键字加亮
  9. alien rpm deb,ubuntu下安装jdk过程及遇到的问题
  10. 知乎面试官:为什么不建议在 MySQL 中使用 UTF-8?