[USACO08JAN]电话线Telephone Lines
多年以后,笨笨长大了,成为了电话线布置师。由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人。该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意两根线杆之间没有电话线连接,一共有p(1<=p<=10000)对电话杆可以拉电话线。其他的由于地震使得无法连接。
第i对电线杆的两个端点分别是ai,bi,它们的距离为li(1<=li<=1000000)。数据中每对(ai,bi)只出现一次。编号为1的电话杆已经接入了全国的电话网络,整个市的电话线全都连到了编号N的电话线杆上。也就是说,笨笨的任务仅仅是找一条将1号和N号电线杆连起来的路径,其余的电话杆并不一定要连入电话网络。
电信公司决定支援灾区免费为此市连接k对由笨笨指定的电话线杆,对于此外的那些电话线,需要为它们付费,总费用决定于其中最长的电话线的长度(每根电话线仅连接一对电话线杆)。如果需要连接的电话线杆不超过k对,那么支出为0.
请你计算一下,将电话线引导震中市最少需要在电话线上花多少钱? ——by洛谷(洛谷少有的良心翻译)
https://www.luogu.org/problem/show?pid=1948
二分答案+有条件的最短路;
- 二分可能的答案,即对读入的边长sort,然后二分
- 对于每个答案跑SPFA(因为手头有SPFA板子)
- SPFA的松弛为spf[x[i].to]=spf[que[h]]+(x[i].dis>ct?1:0)(ct为二分的答案,意味着如果本边长度大于答案,则让这条边占用公司的名额)
- 若spf[n]>k,则把n连入时不可能以当前答案为答案(因为以当前答案为答案,占用名额一定大于k)
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct ss
{
int to,next,dis;
}x[];
int first[];
int d[];
int que[],vis[],spf[];
int n,pd,k,num,p;
void build(int f,int t,int di)
{
x[++num].next=first[f];
x[num].to=t;
x[num].dis=di;
first[f]=num;
}
void spfa(int ,int );
int main()
{
int i,j,l,r,mid;
scanf("%d%d%d",&n,&p,&k);
for(i=;i<=p;i++)
{
scanf("%d%d%d",&j,&l,&d[i]);
build(j,l,d[i]);
build(l,j,d[i]);
}
sort(d+,d+p+);
l=;r=p;mid=(l+r)/;
while(l<r)
{
memset(spf,(0x3f3f3f),sizeof(spf));
pd=;
spfa(,d[mid]);
if(pd==)
{
r=mid;
mid=(l+r)/;
}
else
{
l=mid+;
mid=(l+r)/;
}
}
if(r==p&&pd==)d[r]=-;
printf("%d",d[r]);
return ;
}
void spfa(int s,int ct)
{
int h=,t=,i;
spf[s]=;
que[t]=s;vis[s]=;
while(h<t)
{
h++;
vis[que[h]]=;
i=first[que[h]];
while(i!=)
{
if(spf[x[i].to]>spf[que[h]]+(x[i].dis>ct?:))
{
spf[x[i].to]=spf[que[h]]+(x[i].dis>ct?:);
if(vis[x[i].to]==)
{
t++;
que[t]=x[i].to;
vis[que[t]]=;
}
}
i=x[i].next;
}
}
if(spf[n]<=k)
pd=;
return ;
}
祝AC哟;
[USACO08JAN]电话线Telephone Lines的更多相关文章
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines
P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 题解
P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...
- Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)
P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...
- [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948
这道题其实是分层图,但和裸的分层图不太一样.因为它只要求路径总权值为路径上最大一条路径的权值,但仔细考虑,这同时也满足一个贪心的性质,那就是当你每次用路径总权值小的方案来更新,那么可以保证新的路径权值 ...
- 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines
题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...
- 题解 guP1948 【[USACO08JAN]电话线Telephone Lines】
二分+dij题目 首先读一遍题目,一定要仔细读(不要问我为什么,我就是受害者qwq 你会发现最终的费用是由最长的电话线决定的,而非电话线长度和. 至此就有了一个基本思路--枚举(二分)出可能的最长电话 ...
- P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...
随机推荐
- Matlab实现K-Means聚类算法
人生如戏!!!! 一.理论准备 聚类算法,不是分类算法.分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类.聚类算法是给一大堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类. ...
- hdu 4286
splay 练手用: 杭电的oj要手动开栈: #include<cstdio> #pragma comment(linker, "/STACK:102400000,1024000 ...
- zoj 3757&&3758
3757一个模拟题,简单,但容易错: 3758 大素数判定就行: #include<cstdio> #include<cstring> #include<algorith ...
- WAF 与 RASP 的安装使用大比拼!
什么是WAF和RASP? WAF全称是Web application firewall,即 Web 应用防火墙.RASP 全称是 Runtime Application Self-protect,即应 ...
- Sql狗血的Bit类型赋值与取值
Bit 数据类型在 SQL Server 数据库中以存储 1.0 进行存储. 往数据库中添加,修改 bit 类型的字段时,只能用 0 或者 1. 关于修改 Bit 类型的字段 1.若使用 SQL 语句 ...
- jenkin系列_调度jmeter实现分布式测试
假设现在有 192.168.1.100(jmeter 控制器 C ).192.168.1.101(jmeter负载机 B)两台机器进行分布式测试,各个步骤如下 1. C 和B 安装jmeter,并运行 ...
- mysql查看'datadir'目录
mysql查看创建的数据库的数据,包含表等存放的目录,可以输入下面指令查看: show variables like 'datadir'
- UL LI 布局 TAB 切换条
web页面实现tab的功能有几种实现方式,下面是使用UL LI DIV方式实现的tab. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- Sql server decimal 和 numeric
带固定精度和小数位数的数值数据类型. decimal[ (p[ , s] )] 和 numeric[ (p[ , s] )] 固定精度和小数位数.使用最大精度时,有效值从 - 10^38 +1 到 1 ...
- Android 去除list集合中重复项的几种方法
因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List<"}; List<string> li2 = new List<string& ...