hdu6611----费用流
K Subsequence 题意:给定一个长度为 \(n\) 的数字序列,现可以从中选取k个单调上升的子序列,且每个元素至多只能被选中一次,问k个子序列元素和的最大值。 题解:对数列每一项拆点,连接流量为1,费用为 \(-a[i]\) 的边,所有项的右端点与其后大于等于这一项的项的左端点连流量1,费用0的边。源点与汇点再分别与各项左右端点连边。超级源点与源点连流量k费用0的边。跑最小费用最大流。 #include <bits/stdc++.h> using namespace std; int n,k,a[2005]; typedef pair<int,int> pa; struct node{ int to,flo,cost,rev; }; int ss,s,t,tt; vector<node> gra[5000]; void add(int u,int v,int flo,int cost){ node tmp; tmp.to=v; tmp.flo=flo; tmp.cost=cost; tmp.rev=gra[v].size(); gra[u].push_back(tmp); tmp.to=u; tmp.flo=0; tmp.cost=-cost; tmp.rev=gra[u].size()-1; gra[v].push_back(tmp); } int h[5000]