【洛谷P1948】[USACO08JAN]电话线
电话线
题目链接:https://www.luogu.org/problemnew/show/P1948
二分答案+最短路
我们要求一条1~n的路径,使其中的第k+1大的数最小。
二分第k+1大的数的大小h,比h小的边可以看为0,因为它们不会让第k+1大的数更大;比h大的边边权设为1,最后求出的1~n的最短路,就是在第k+1大的数小于等于h时需要让电信公司承担的电话线数,因为在第k+1大的数的大小限制为h的情况下,任何比h大的数都不可以自己承担。若dis[n]>k返回false,否则返回true。
不知为啥跑的贼慢。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int INF = ;
struct Edge{ //邻接表
int to;
int w;
int next;
} edge[];
int sum,n,p,k,head[];
void add(int x,int y,int w)
{
edge[++sum].next=head[x];
edge[sum].to=y;
edge[sum].w=w;
head[x]=sum;
}
int dis[];
struct cmp{
bool operator () (int a,int b)
{
return dis[a]>dis[b];
}
};
priority_queue < int , vector<int> , cmp > q;
void clear(priority_queue< int , vector<int> , cmp > &qq) //清空队列
{
priority_queue < int , vector<int> , cmp > empty;
swap(qq,empty);
}
bool dijkstra(int _std) //堆优化dijkstra
{
for(int i=;i<=n;i++)
dis[i]=INF;
bool v[]={};
clear(q);
q.push();
dis[]=;
while(!q.empty())
{
int k=q.top();
q.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
{
int j=edge[i].to;
if(!v[j]&&dis[j]>int(edge[i].w>_std)+dis[k])
dis[j]=int(edge[i].w>_std)+dis[k];
q.push(j);
} }
return dis[n]<=k;
}
int main()
{
scanf("%d%d%d",&n,&p,&k);
int x,y,w;
for(int i=;i<=p;i++)
{
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
}
int l=,r=;
while(l<r) //二分
{
int mid=(l+r)>>;
if(dijkstra(mid)) r=mid;
else l=mid+;
}
if(l==) l=-;
printf("%d\n",l);
return ;
}
【洛谷P1948】[USACO08JAN]电话线的更多相关文章
- 洛谷 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. ...
- 洛谷 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 ...
- 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
题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...
- [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948
这道题其实是分层图,但和裸的分层图不太一样.因为它只要求路径总权值为路径上最大一条路径的权值,但仔细考虑,这同时也满足一个贪心的性质,那就是当你每次用路径总权值小的方案来更新,那么可以保证新的路径权值 ...
- 洛谷 [P1948] 电话线
二分答案 首先,最大值最小,就是二分答案 #include <iostream> #include <cstdio> #include <algorithm> #i ...
- 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告
[USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...
随机推荐
- android window(二)从getSystemService到WindowManagerGlobal
在Activity调用getSystemService(WINDOW_SERVICE) 调用的是父类ContextThemeWrapper package android.view; public c ...
- Kure讲HTML_列表标签及表单标签
首先我上个图来告诉大家什么是列表 左侧的这一部分就可以称为是列表或者叫树,其实我们可以通过div+css实现列表,可是考虑语义化的问题,我们还是看看html提供好的列表标签,html提供了两种列表,一 ...
- 二叉搜索树-php实现 插入删除查找等操作
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- 单元测试-Junit-Mockit-PowerMock
0. Junit5 1. Junit4 //手动命令行测试 java -cp /usr1/junit:/usr1/cdncms/lib/* org.junit.runner.JUnitCore com ...
- Prestashop后台模块(中英转译)
=======================Prestashop-Modules========================= Pretashop运行起来非常慢,这个大家应该都知道,最近要给这个 ...
- python3.4中自定义wsgi函数,make_server函数报错问题
别的不多说,先上代码 #coding:utf-8 from wsgiref.simple_server import make_server def RunServer(environ, start_ ...
- Asp.Net MVC 5 Razor 视图 未将对象引用到实例
未将对象引用到实例的错误居然指向了@{Leyout=“..此处略,核实路径无误”}. 最后发现原来是在一个<select .. name="@Model.Category"& ...
- hystrix应用介绍(二)
上篇博客中讲了hystrix在公司中的一些应用场景,由于保密的原因没办法贴出优化的代码,这里专门写一篇hystrix代码的demo,供大家在使用的过程中快速上手 Hystrix有两个请求命令 Hyst ...
- Snipaste的详细安装和使用
Snipaste安装和使用 1:snipaste的安装 步骤一: https://zh.snipaste.com/ ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网 ...
- switch 和 if...else if 的区别
为什么很多人用 if...else..if 而不使用 switch 1,if...else...if 只是单纯地一个接一个比较:if...else可能每个条件都计算一遍: 2,switch ...