一道图论的最短路题。一开始连最短路都没想到,可能是做的题太少了吧,完全没有思路。

题目大意:

FJ的农场周围分布着N根电话线杆,任意两根电话线杆间都没有电话线相连。一共P对电话线杆间可以拉电话线,第i对电话线杆的两个端点分别为A_i、B_i,它们间的距离为L_i 。数据中保证每对{A_i,B_i}最多只出现1次。FJ的任务是找一条将1号和N号电话线杆连起来的路径。电信公司最终同意免费为FJ连结任意K对电话线杆。此外的电话线,FJ需要为它们付的费用,等于其中最长的电话线的长度(每根电话线仅连结一对电话线杆)。如果需要连结的电话线杆不超过K对,那么FJ的总支出为0。求FJ最少需要在电话线上花多少钱,如果任务不可能完成,输出-1。

1 <= N <= 1,000

1 <= P <= 10,000

1 <= L_i <= 1,000,000

0 <= K < N

样例输入

5 7 1

1 2 5

3 1 4

2 4 8

3 2 3

5 2 9

3 4 7

4 5 6

样例输出

4

注意一句话题意 : 在加权无向图上求出一条从 1号结点到n号结点的路径,使路径上第k+1大的边权尽量小。”

我们不妨将这条k+1大的边权设为\(P\),将图中大于等于\(P\)的边权类似离散的思想的将它们赋为1,反之赋为0。这里就不给出图了。我们再对离散后的图跑一遍最短路,设这时1-n的最短路长度为\(X\),我们便可以发现\(P\)在这条最短录径上第\(X+1\)的边(因为比\(P\)大的边只有\(X\)条)

试问,如果这个\(X\)比\(K+1\)还大,请问这个\(P\)还可以作为我们的答案吗?肯定是不行的,因为我们跑的是最短路,也就是\(X\)最小的情况,如果这个\(X\)比\(K+1\)还大,那么这条边\(P\)就不可能是\(K+1\)大的边,自然就会舍去。

现在要解决的是\(P\)的问题,直接枚举吗?其实根本不需要,我们发现如果\(P\)跑出来的最短路小于等于\(K\),那么\(P+1\)跑出来的最短路也一定小于等于\(K\),答案明显满足单调性,因此我们可以使用二分来做这道题。

(有的人可能要为为什么是小于等于\(K\),按照一句话题意不是要我们求\(X\)等于\(K\)的情况。我的理解是有的路径的条数可能比\(K\)还少,但我们依然可以选择这条路径上的边。另外,这样也适应了二分的情况。如果是等于,二分则跑不出来。)

关于对图的离散化,不要告诉我们你们会直接把所有边都赋为1和0,在代码中我们只需要这么做(我用的是dijkstra的堆优化)

			v=G[now.u][i].v,w=G[now.u][i].w;
if(w>=P) w1=1;
else w1=0;
if(dis[now.u]+w1<dis[v]) {
dis[v]=dis[now.u]+w1;
q.push( node (dis[v],v));
}

代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
#include <cstring>
#include <queue>
using namespace std; #define N 50010
#define inf 0x7f7f7f7f struct node {
int u,dis;
node () {};
node (int D,int U) { u=U; dis=D; }
bool operator < (const node& h) const {
return dis>h.dis;
}
}; struct Gragh {
int v,w;
Gragh () {};
Gragh (int V,int W) {v=V;w=W;}
}; int P[10],n,m,k,ans=inf,vis[N],sum=1,dis[N];
vector<Gragh> G[N];
priority_queue<node> q; int dijkstra(int st,int P) {
q.push( node (0,st) );
memset(dis,0x3f,sizeof(dis));
dis[st]=0;
memset(vis,0,sizeof(vis));
while(!q.empty() ) {
node now=q.top();
q.pop();
if(vis[now.u]) continue;
vis[now.u]=1;
for(int i=0,v,w,w1;i<G[now.u].size();i++) {
v=G[now.u][i].v,w=G[now.u][i].w;
if(w>=P) w1=1;
else w1=0;
if(dis[now.u]+w1<dis[v]) {
dis[v]=dis[now.u]+w1;
q.push( node (dis[v],v));
}
}
}
return dis[n];
} bool check(int mid) {
if(dijkstra(1,mid)<=k) return 1;
return 0;
} /*
4 3 3
1 2 1
2 3 2
3 4 3
*/ int main() {
int maxw=0;
cin>>n>>m>>k;
for(int i=1,u,v,w;i<=m;i++) {
cin>>u>>v>>w;
maxw=max(maxw,w);
G[u].push_back( Gragh(v,w) );
G[v].push_back( Gragh(u,w) );
}
int mid,l=0,r=maxw,flag=0;
while(l<r) {
mid=(l+r+1)/2;
if(check(mid)) r=mid-1,flag=1;
else l=mid;
}
if(!flag) cout<<"-1";
else cout<<l;
}

(话说二分每次都打不对orz)

[USACO 2008 Jan. Silver]架设电话线 —— 最短路+二分的更多相关文章

  1. USACO 2008 January Silver Telephone Lines /// 二分最短路 邻接表dijkstra oj22924

    题目大意: 一共有N (1 ≤ N ≤ 1,000)个电线杆,有P P (1 ≤ P ≤ 10,000)对电线杆是可以连接的, 用几条线连接在一起的电线杆之间都可相互通信,现在想要使得电线杆1和电线杆 ...

  2. [USACO 2012 Jan Silver] Delivery Route【拆点】

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=106 这道题还真是完全没思路,真的不知道怎么做,但是看了题解后恍然大悟. ...

  3. [USACO 2012 Jan Silver] Bale Share【DP】

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=107 没想到太不应该了,真的不应该啊! f[i][j][k]表示前i个包, ...

  4. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线:spfa + 二分【路径中最大边长最小】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1614 题意: 给你一个无向图,n个点,m条边. 你需要找出一条从1到n的路径,使得这条路径 ...

  5. USACO 2008 Mar Silver 3.River Crossing 动态规划水题

    Code: #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

  6. LOJ10074架设电话线

    USACO 2008 Jan. Silver 在郊区有 N 座通信基站,P 条双向电缆,第 i 条电缆连接基站 Ai​ 和 Bi​.特别地,1 号基站是通信公司的总站,N 号基站位于一座农场中.现在, ...

  7. POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7214   Accepted: 2638 D ...

  8. (poj 3662) Telephone Lines 最短路+二分

    题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total ...

  9. poj 3662 Telephone Lines(最短路+二分)

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6973   Accepted: 2554 D ...

随机推荐

  1. C# Base64加解密

    using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...

  2. maven 依赖显示红线 pom文件不显示红线的一种可能问题

    pom文件引用的是CDH的jar包 而没有配置CDH的仓库 导致maven找不到资源  ,依赖显示红色波浪,并且在仓库内生成了一堆.lastupdate文件 解决: 1. 删除本地仓库内所有的.las ...

  3. Selenium Java tutorial

     https://eyes.applitools.com/app/test-results 1.

  4. 简单了解Spring中常用工具类_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...

  5. 使用Spring.Net进行Webservice开发&发布遇到的问题

    发布遇到的问题1: HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理. 最终解决时IIS的设置情况: 1.应用程序池的高级设置中 启用32 ...

  6. linux运维、架构之路-禅道环境搭建

    一.介绍            禅道项目管理软件是国产的开源项目管理软件,专注研发项目管理,内置需求管理.任务管理.bug管理.缺陷管理.用例管理.计划发布等功能,实现了软件的完整生命周期管理. 禅道 ...

  7. 七夕-心形表白-简单css代码

    今天你要和谁过? 今天你要怎么过?? 今天去哪里吃??? 公司的三连问,对于一些单身狗有点招架不住啊. 在此送上一个薄礼,来安慰下受伤的心灵... 确定是安慰不是连环打击嘛..... 回答:确定! 来 ...

  8. Java使用google身份验证器实现动态口令验证

    参考: 1)https://www.jb51.net/article/121243.htm 2)https://www.cnblogs.com/wuaili/p/9810661.html

  9. 数位dp进阶(hdu2089,3652)

    之前的文章已经讲过如何求1—r中的特殊数,这篇博客就来讲些进阶操作: 直接看例题(hdu2089): (题目是中文的我就不写大意了) 这题与hdu3555最大的区别就是规定了l,不再以1开始: 解决这 ...

  10. 「BalticOI 2011」Switch the Lamp On

    Casper is designing an electronic circuit on a \(N \times M\) rectangular grid plate. There are \(N ...