T1:
先跑个Floyd,然后求一下建在点上的答案
容易发现已经把答案限制的比较紧了
然后统计边的答案,加一个最优性剪枝
然后考虑二分解决就行了
如果不加剪枝,复杂度为(O(n^3+n^3logC))
如果加上的话,因为第一次就把答案限制的很紧,所以复杂度大概为(O(n^3+n^2logC))
T2:
有点东西
一条合法路径显然可以分成三段,1->a->b->n,其中a->b中不经过任意一条最短路边
1->a和b->n走最短路就完了,a->b整个二进制分组就行了,但多一个log跑不过(可能是我自带大常数QAQ)
那就随它!
logn大概是17,那就随机其中的一些跑一下,调调种子就过了(19260817好啊)
T3:
题解的做法要消圈,太麻烦就没写
考虑另一种做法,反着考虑,先将所有位置填上,然后考虑最少需要拿下来几个
枚举limit
对于行列建点,S向行连(数量,0)的边,列向T连(数量,0)的边
对应的行列间,行向列连(limit,0)的边,表示可以留下limit个
对于(i,j)为空地,i行向j列连(1,1)的边,表示可以取下来一个
跑最小费用最大流,若最后满足当前(limit leq all*A/B)的限制,则更新答案