电话线

题目链接: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]电话线的更多相关文章

  1. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  2. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 题解

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  3. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...

  4. 洛谷P1948 [USACO08JAN]电话线Telephone Lines

    题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...

  5. Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)

    P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...

  6. 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines

    题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...

  7. [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948

    这道题其实是分层图,但和裸的分层图不太一样.因为它只要求路径总权值为路径上最大一条路径的权值,但仔细考虑,这同时也满足一个贪心的性质,那就是当你每次用路径总权值小的方案来更新,那么可以保证新的路径权值 ...

  8. 洛谷 [P1948] 电话线

    二分答案 首先,最大值最小,就是二分答案 #include <iostream> #include <cstdio> #include <algorithm> #i ...

  9. 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告

    [USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...

随机推荐

  1. python3 pip使用报错

     在windodws上pip3使用了很长时间,今天突然报错. Fatal error in launcher: Unable to create process using '"' 解决方案 ...

  2. python DataFrame索引选项

    obj[val]-----------选取DataFrame的单个列或一组列,在一些情况下会比较便利:布尔型数组(过滤行).切片(行切片).布尔型DataFrame obj.ix[val]------ ...

  3. Android中的时间格式的校验

    public class MainActivity extends Activity implements OnClickListener{ private Button btn1; private ...

  4. DB Intro - MySQL and MongoDB

    mysql> CREATE TABLE tutorials_tbl( tutorial_id INT, tutorial_title VARCHAR(100), tutorial_author ...

  5. Java基本语法_循环练习系列(二)——万年历

    写万年历大致可以分为以下几个步骤: 1.根据用户输入的年份判断该年是否是闰年. 2.根据用户输入的月份计算该月的天数. 3.计算输入的年份之前的总天数. 4.计算输入的月份之前的天数. 5.计算该月的 ...

  6. 学习用node.js建立一个简单的web服务器

    一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...

  7. 启动和停止GlassFish Server

    您可以使用NetBeans IDE或命令行启动和停止GlassFish Server.   使用NetBeans IDE启动GlassFish Server 单击“服务”选项卡. 展开服务器. 右键单 ...

  8. PHP保存Base64图片base64_decode的问题

    PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码. 编码上,只要将图片流读取到,而后使用base64_encode进行进 ...

  9. C++ VS编译问题--LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    用VS编译时,当出现错误LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏: 这个问题的解决方案为: 1. 找到项目\xx属性\配置属性\清单工具\输 ...

  10. 解决javascript四舍五入不准确

    function roundFixed(num, fixed) { var pos = num.toString().indexOf('.'), decimal_places = num.toStri ...