P1948 [USACO08JAN]电话线Telephone Lines
传送门
思路:
二分+最短路径:可以将长度小于等于 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的更多相关文章
- 洛谷 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 ...
- P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...
- [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948
这道题其实是分层图,但和裸的分层图不太一样.因为它只要求路径总权值为路径上最大一条路径的权值,但仔细考虑,这同时也满足一个贪心的性质,那就是当你每次用路径总权值小的方案来更新,那么可以保证新的路径权值 ...
- 题解【洛谷P1948】[USACO08JAN]电话线Telephone Lines
题面 题解 很显然,答案满足单调性. 因此,可以使用二分答案求解. 考虑\(check\)的实现. 贪心地想,免费的\(k\)对电话线一定都要用上. 每次\(check\)时将小于\(mid\)的边权 ...
- [USACO08JAN]电话线Telephone Lines
多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意 ...
随机推荐
- Codeforce 834A - The Useless Toy
Walking through the streets of Marshmallow City, Slastyona have spotted some merchants selling a kin ...
- Elasticsearch集群内的原理
一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力.当有节点加入集群中或者从 ...
- 判断闰年C语言版
#include<stdio.h> int isLeap(int year) { // 必须先判断是平年的情况 后判断闰年的情况 == && year%!=) || yea ...
- Introduction To Machine Learning Self-Evaluation Test
Preface Section 1 - Mathematical background Multivariate calculus take derivatives and integrals; de ...
- 问题:grid卸载后重新安装时ASM磁盘识别不到了
现象,磁盘路径是对的,但是识别不出来asmdisk2 系统显示磁盘也存在 识别不到的原因是:安装了一次磁盘已经有asm信息写入,需要擦除才能重新被识别到,命令如下 [root@swnode1 dev] ...
- java的MVC与C#
Views: @{ Layout = "~/Views/Shared/_Layout.cshtml"; } @{ ViewBag.Title = "Index" ...
- 动态规划之140 Word Break2
这是一题不太明显的动态规划,主要考察的应该是深度优先搜索. static LinkedList<String> list = new LinkedList<String>(); ...
- Mac安装HomeBridge适配小米Homekit报错:module未找到解决
Mac安装HomeBridge适配小米Homekit报错:module未找到 具体错误是: module.js:471 throw err; balabalal...... 问了一圈,终于解决,但是又 ...
- 将svn下载的项目转化为java project
1.选中项目,右键点击弹出窗口,点击窗口中的[Properties],弹出[Properties for test]窗口, 如下: 2.点击窗口中的[Project Facets],右边显示[Conv ...
- topcoder srm 330 div1
problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*; public c ...