传送门

思路:

  二分+最短路径:可以将长度小于等于 mid 的边视为长度为 0 的边,大于 mid 的边视为长度为 1 的边,最后用 dijkstra 检查 d [ n ] 是否小于等于 k 即可。

标程:

#include<cstring>
#include<queue>
#include<cstdio>
#include<iostream>
#include<vector>
#include<fstream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<set>
#include<deque>
#include<string>
using namespace std;
#define maxn 100100
#define INF 0x3f3f3f3f
priority_queue<pair< int,int >,vector<pair<int,int> >,greater<pair<int,int > > > q;
struct hh
{
int u,v,w,nex;
}t[maxn<<];
int d[maxn<<],head[maxn<<],jla[maxn<<];//jla记录每条边的边长
int n,m,p,s=,cnt=,ans=INF;//ans记录答案
bool vis[maxn<<];
inline int read()
{
int kr=,xs=;
char ls;
ls=getchar();
while(!isdigit(ls))
{
if(ls=='-')
kr=-;
ls=getchar();
}
while(isdigit(ls))
{
xs=(xs<<)+(xs<<)+(ls^);
ls=getchar();
}
return kr*xs;
}
inline void add(int x,int y,int z)
{
t[++cnt].u=x;
t[cnt].v=y;
t[cnt].w=z;
t[cnt].nex=head[x];
head[x]=cnt;
}//链式前向星加边
inline bool dijkstra(int now)
{
for(int i=;i<=n;i++)
{
d[i]=INF;
vis[i]=false;
}
d[s]=;
q.push(make_pair(d[s],s));
while(!q.empty())
{
int k=q.top().second;
q.pop();
if(vis[k]) continue;
else
{
vis[k]=true;
for(int i=head[k];i!=-;i=t[i].nex)
{
if(t[i].w>now)
if(d[t[i].v]>d[k]+)
{
d[t[i].v]=d[k]+;
q.push(make_pair(d[t[i].v],t[i].v));
}//如果t[i].v的边大于当前二分的答案,那么就要使用一次名额
if(t[i].w<=now)
if(d[t[i].v]>d[k])
{
d[t[i].v]=d[k];
q.push(make_pair(d[t[i].v],t[i].v));
}//如果t[i].v的边不大于当前二分的答案,那么就无需使用名额,直接松弛操作
}
}
}
if(d[n]>p) return false;//如果到达n的次数大于免费的次数限制,那么当前答案不可行
return true;//反之,则可行
}
int main()
{
n=read();m=read();p=read();
for(int i=;i<=n;i++)
head[i]=-;
int xx,yy,zz;
for(int i=;i<=m;i++)
{
xx=read();yy=read();zz=read();
add(xx,yy,zz);
add(yy,xx,zz);
jla[i]=zz;
}
sort(jla+,jla+m+);//将所有的边从小到大排序,为二分做准备
if(dijkstra())
{
printf("0\n");
return ;
}
if(!dijkstra(jla[m]))
{
printf("-1\n");
return ;
}//两个特判,,,
int l=,r=m;
while(l<=r)
{
int mid=l+r>>;//二分查找
if(dijkstra(jla[mid]))
{
ans=min(ans,jla[mid]);
r=mid-;
}
else l=mid+;
}
printf("%d\n",ans);//输出答案
return ;
}

  

P1948 [USACO08JAN]电话线Telephone Lines的更多相关文章

  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. Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)

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

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

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

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

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

  6. P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)

    思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...

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

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

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

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

  9. [USACO08JAN]电话线Telephone Lines

    多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意 ...

随机推荐

  1. hdu1599 find the mincost route

    题目链接 floyd找最小环 很好理解 #include<algorithm> #include<iostream> #include<cstdlib> #incl ...

  2. Autel MaxiSys Pro MS908P Software Update Gudie

    This article aims to guide on how to update software for Autel MaxiSys Pro. (Suitable for MaxiDiag E ...

  3. linux /etc/shadow--passwd/pam.d/system-auth文件详解

     在linux操作系统中, /etc/passwd文件中的每个用户都有一个对应的记录行,记录着这个用户的一下基本属性.该文件对所有用户可读.   而/etc/shadow文件正如他的名字一样,他是pa ...

  4. js 简易时钟

    html部分 <div id="clock"> </div> css部分 #clock{ width:600px ; text-align: center; ...

  5. jQuery获取子元素个数的方法

    //获取id=div1下的子元素的个数 $('#id').children().length; //获取id=div1下的p元素个数 $('#id').children('p').length;

  6. 计算概论(A)/基础编程练习(数据成分)/1:短信计费

    #include<stdio.h> int main() { // 输入当月发送短信的总次数n和每次短信的字数words int n,words; scanf("%d" ...

  7. js遍历对象所有的属性名称和值

    /* * 用来遍历指定对象所有的属性名称和值 * obj 需要遍历的对象 * author: Jet Mah * website: http://www.javatang.com/archives/2 ...

  8. Golang切片的三种简单使用方式及区别

    概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...

  9. Android之Sqlite数据库

    数据库访问完毕后,游标必须也记得关闭 import com.huangzhong.love_power_model.UserInfoDto; import java.util.ArrayList; i ...

  10. Codeforces 888G Xor-MST - 分治 - 贪心 - Trie

    题目传送门 这是一条通往vjudge的高速公路 这是一条通往Codeforces的高速公路 题目大意 给定一个$n$阶完全图,每个点有一个权值$a_{i}$,边$(i, j)$的权值是$(a_{i}\ ...