1、https://vjudge.net/contest/327737#problem/I 最小费用最大流+迪杰斯特拉优化
给出一组数,找到k个不下降子序列(没要求长度),且每一个点只能选择一次,求这些序列和值的最大值。
思路:
将源点S拆为入点S0和出点S1,S0->S1的流量为K,费用为0,保证只拿K次。
对于点Ai,拆分成Ai0和Ai1,入点向出点连一条流量为1的边,保证只选一次这个点,费用为-Ai。
然后枚举i后面的点j,若j点值>=i点值,则Ai1->Aj0连一条边,费用为0,流量为1.
最后,将S1与Ai0连一条流量为1并且费用为0的边,将Ai1->T连一条流量为1并且费用为0的边。
从S0->T跑一遍最小费用最大流。
网络流24题中有一道题,换了一下问法,问 给出一组数,问有多少个长度为k的不下降子序列,且每一个点只能选择一次。这就是最大流的问题了。这一周把网络流24题看完。
思路,先求出以i点开始的fi,代表以i开始的最长不下降子序列。
建图,把每一个点拆分成两个点 Ai1 Ai2 ,连一条容量为1的边(边的容量代表了数的使用次数)。
对于Ai点,若其Fi为1,那么源点S->Ai1,容量为1.若为K,那么Ai2->T,容量为1。分层图思想,按fi分层,S->T的路径都是合法的。
对于j>i且Fj+1=Fi、Aj>=Ai,连一条Ai2->Aj1,容量为1的边。
求S->T的最大流。
若修改为A1 AN可以用无数次,那么取消这两个点相关边的容量限制,然后跑最大流。即
A11->A12=INF
AN1->AN2=INF
S->A11=INF
AN2->T=INF
https://www.luogu.org/blog/zcysky/solution-p2766
2、http://codeforces.com/problemset/problem/237/E
给出S串和n个T串,问从第i个串中拿出一个字符的代价为i,且最多拿numi个,求能否构成S,最小费用。
建图方式如下
3、https://codeforces.com/problemset/problem/231/E
给出一个仙人掌无向图,问a-b的简单路径有多少。
就是a-b所经过的简单环cnt相关的答案 。
先缩点,把环缩成点,形成一个树,从头对新点进行标号,进行建立一个树。
for(u=1; u<=n; u++)
{
for(int i=0; i<G[u].size(); i++)
{
int v=G[u][i];
if(fa[u]!=fa[v])
tree[fa[u]].push_back(fa[v]);//建一颗树
}
}
然后进行dfs,遍历这棵树,求出dist数组,含义为i点到根点经过的环的个数。
然后进行求lca(类似于求lca的思想),u,v两点之间的环数为
4、https://codeforces.com/problemset/problem/711/D
给出有向图,i->fi为边的方向,问有多少种反转边方向的方法,使得无环。
对于环来说,其中的点有cnt,那么答案为,对于所有不在环中的点x,有种,,答案乘起来即可。
可以dfs找环,每次记录环中点的数目。
也可以用tarjan找,判断缩点后的点。
5、https://blog.csdn.net/mengxiang000000/article/details/53026275
给出起点标号,问最多能到达的点的个数。
缩点之后求最长路。
感觉这部分的题很老了啊...
6、http://acm.fzu.edu.cn/problem.php?pid=1719
有些特殊人可以某种途径通知到,然后通知具有传递性,A->B B->C 那么A->C ,然后给出这些特殊人的标号和费用。
问能不能用最小的费用使得人全部被通知到,不能的话输出度为0的节点中编号最小的顶点编号。
分析:
先利用强连通缩点,成了一个新的图,求图中入度为0的节点,然后若特殊人不再此新点内,那么输出NO。
若所有缩点都符合,那么求出每一个缩点中的最小值。
答案累加。
强连通分量这部分的题感觉好老啊