BZOJ 1614 USACO 07Jan. 洛谷1948 电话线】的更多相关文章

二分+特殊姿势的check:二分最小代价P,把边权小于等于P的边设为0,其他的设为1,跑一遍最短路,判断dis[n]是否大于K #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; ; ,Maxdis=,last[maxn],dis[maxn]; bool v[maxn]; struct edge{int to,pre,dis;}…
题目 1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连.一共P(1 <= P <= 10…
二分答案+单源最短路 POJ原题链接 洛谷原题链接 显然可以二分答案,检验\(mid\)可以使用最短路来解决. 将大于\(mid\)的边看成长度为\(1\)的边,说明要使用免费升级服务,否则长度为\(0\)边,即不需要占免费的资格. 然后就可以在上面跑最短路,如果\(dis[n]>k\)说明该答案不可行,将答案改大,否则说明可行,往小的去尝试. 而针对长度只有\(0,1\)的图可以使用双端队列的\(BFS\)来解决,不过我这种懒人就直接跑\(SPFA\)了. #include<cstdio&g…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5120 https://www.luogu.org/problemnew/show/P4003 神奇的费用流建图: 首先,网格图,相邻之间有关系,所以先二分染色一下: 然后发现问题就是染色后黑白点之间要完美匹配插头: 所以可以考虑把旋转通过带一些代价变成插头方向的变化: 把一个格子拆成上下左右四个点,分类讨论,连边即可: 然而一开始连边竟然写了100多行...然后T了: 看了看题解代码,突然…
题目链接: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最少要去掉多少条边,…
Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1930  Solved: 823[Submit][Status][Discuss] Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连.一共P(1 <= P <…
二分答案 首先,最大值最小,就是二分答案 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <queue> using namespace std; const int MAXN = 10005; int head[MAXN],…
二分答案,然后把边权大于二分值的的边赋值为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…
[题解] 题目要求找到一个集合点,使3个给定的点到这个集合点的距离和最小,输出集合点的编号以及距离. 设三个点为A,B,C:那么我们可以得到Dis=dep[A]+dep[B]+dep[C]-dep[Lca]-dep[Lca2]*2:其中Lca是A,B的最近公共祖先:Lca2是Lca与C的最近公共祖先.那么为了使Dis最大,必须使dep[Lca]+dep[Lca2]*2最大.那么我们只需找出A,B,C两两之间Lca中Dep最大的作为集合点就可以了. #include<cstdio> #inclu…
题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大于等于x的边权的边长为1,其余为0,起点到终点的最短路” 然后如果这个得到的最短路,也就是我们所需要免费的边数小于等于k的话,就可以满足题意了(check) 思考一下可以发现对于任何条件,都存在某一个p,当x取[p, inf]的任意值时,都是可以满足题意的 于是我们就可以二分x并check了 得到p…