【Luogu】P1948电话线(二分SPFA)】的更多相关文章

题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连.一共P(1 <= P <= 10,000)对电话线杆间可以拉电话线,其余的那些由于隔得太远而无法被连接. 第i对电话线杆的两个端点分别为A_i.B_i,它们间的距离为 L_i (1 <= L_i <=…
Trucking 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2224 Descriptionww.co A certain local trucking company would like to transport some goods on a cargo truck from one place to…
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根据套路,二分是显然的.然后跑一下spfa判断正环就行了. 然而我被no solution坑了十次提交.. #include <cctype> #include <cstdio> #include <cstring> using namespace std; const in…
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建议使用while(l <= r),会避免出现答案为 \(r\) 时和答案AFK搞混,样例就是这种情况. 复杂度为 \(O(\log n) \times\) 最短路的复杂度. 二分 + Dijkstra版本,复杂度为 \(O(\log n \times E\log E)\) . #include<s…
题目链接 二分最长的电话线长度.把所有大于这个长度的边权设成1,小于等于的设成零,然后跑SPFA看dis[n]是否>k.若>k则l=mid+1 否则r=mid-1 放代码 #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> inline long long read(){ ,f=; char ch=getchar(); while(!isdigit(ch)…
P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncooperative, so he needs to pay for some of the cables required to connect his farm to the phone system. Ther…
http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. 求比某个价值大的某条路径的数量,只要小于k,那么这一定是一个可行解.因为其它的边都是小于了这个价值.(当然这里指的都是需要价格的) 我们在求这条路径时还要满足这条路径比这个价值大的边要最小,当然用最短路求. 那么问题就转换为,给定一个价值,求1-n的一条路径满足比这个价值大的边最少,而且少于k. 那…
题目链接: https://www.luogu.org/problemnew/show/P1462 思路: 又是一道水题,很明显二分+最短路 而且这道题数据非常水,spfa有个小错误居然拿了91分还比正解快 我们二分金钱数,节点权值大于二分值的都不能走.二分中跑spfa,如果不能走到终点,即dis[n]>=b,则说明二分值偏小. 注意: 血量\(<=0\)则说明不能达到 二分不要写错,这次居然一遍写对 有个比较明显的优化,显然最小值一定是某个节点的权值,所以我们可以排序离散化后二分下标,但是我…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1614 题意: 给你一个无向图,n个点,m条边. 你需要找出一条从1到n的路径,使得这条路径上去掉k条最大的边后,剩余边中最大的边最小. 问你最大边最小为多少. 题解: 求最大值最小:二分. 二分:最大边的值L. check函数: 每次一遍spfa. 对于每条边,如果len > L,则认为该边边权为1:如果len <= L,则边权为0. dis[i]也就代表:从1到i最少要去掉多少条边,…
二分答案,然后把边权大于二分值的的边赋值为1,其他边赋值为0,然后跑spfa最短路看是否满足小于等于k条边在最短路上 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=1005,M=10005,inf=1e9; int n,m,k,h[N],cnt,dis[N]; bool v[N]; struct qw…