AcWing题目

洛谷题目

解题思路

首先可以得到一个很容易得到的贪心策略,将一条路径上最贵的(边权最大)的\(K\)条边删去,那么我们剩下的路径中最贵(边权最大)的路就是原本这条路径上帝\(K + 1\)大的路。

于是原问题就可以转化为:

求一张无向图中最大的一条路径中的第\(K+1\)大的边

这就启发我们枚举所有的路径。

可行吗?

显然是不可行的,这个路很多,但是我们可以反向思考

我们可以假定一个距离\(x\),然后看看这张图上是否存在一条路径,使它上面第\(K + 1\)大的边长度为\(x\),进一步的,我们可以转化成为在这张图中,是否存在\(K\)条边,任意一条边的权重\(W_{i}>x\)

这样我们的\(check\)函数似乎就呼之欲出了

check函数

这里的\(check\)我们判断一张图中是否有\(K\)条权重大于\(x\)的边,可以进行一下转换:

对于边权\(W_{i} > x\) 的边,设置权重\(w_{i} = 1\)(这是小w,不是原题给定权重)

反之设置权重\(w_{i} = 0\)

然后跑下这张图的最短路(\(从1到N\)),判断是否\(\le k\)即可

Dijkstra写法 \(O(mlog^{2}n)\)

这没什么好说的,就是建图跑最短路,因为边权非负(只能是\(0或1\))

#include <iostream>
#include <cstring>
#include <queue> using namespace std;
typedef pair<int, int> PII; const int N = 20020;
int h[N], e[N], w[N], ne[N], idx;
int dist[N], st[N], n, m, k; void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;
} bool check(int x)
{
memset(dist, 0x3f, sizeof dist);
memset(st, 0, sizeof st); priority_queue<PII, vector<PII>, greater<> > heap;
dist[1] = 0, heap.push({dist[1], 1}); while (heap.size())
{
auto t = heap.top().second; heap.pop(); if (st[t]) continue ;
st[t] = true ; for (int i = h[t]; ~i; i = ne[i])
{
int j = e[i], W = (w[i] > x);
if (dist[j] > dist[t] + W)
{
dist[j] = dist[t] + W;
heap.push({dist[j], j});
}
}
} return dist[n] <= k;
} int main()
{
scanf("%d%d%d", &n, &m, &k); memset(h, -1, sizeof h);
while (m -- )
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w), add(v, u, w);
} int l = 0, r = 1e6 + 1;
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
if (r == 1e6 + 1) r = -1;
printf("%d\n", r); return 0;
}

双端队列广搜 \(O(mlogn)\)

因为边权只有\(0-1\),可以用双端队列广搜,时间是线性的,再乘上二分次数,是\(O(mlogn)\)

#include <iostream>
#include <cstring>
#include <queue> using namespace std;
typedef pair<int, int> PII; const int N = 20020;
int h[N], e[N], w[N], ne[N], idx;
int dist[N], st[N], n, m, k; void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;
} bool check(int x)
{
memset(dist, 0x3f, sizeof dist);
memset(st, 0, sizeof st); deque<int> dq;
dist[1] = 0, dq.push_back(1); while (dq.size())
{
int t = dq.front(); dq.pop_front(); if (st[t]) continue ;
st[t] = true ; for (int i = h[t]; ~i; i = ne[i])
{
int j = e[i], W = (w[i] > x);
if (dist[j] > dist[t] + W)
{
dist[j] = dist[t] + W;
if (W) dq.push_back(j);
else dq.push_front(j);
}
}
} return dist[n] <= k;
} int main()
{
scanf("%d%d%d", &n, &m, &k); memset(h, -1, sizeof h);
while (m -- )
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w), add(v, u, w);
} int l = 0, r = 1e6 + 1;
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
if (r == 1e6 + 1) r = -1;
printf("%d\n", r); return 0;
}

SPFA \(O(mlogn\sim 被卡飞)\)

和Dijkstra一样,跑个最短路

#include <iostream>
#include <cstring>
#include <queue> using namespace std;
typedef pair<int, int> PII; const int N = 20020;
int h[N], e[N], w[N], ne[N], idx;
int dist[N], st[N], n, m, k; void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;
} bool check(int x)
{
memset(dist, 0x3f, sizeof dist);
memset(st, 0, sizeof st); queue<int> q;
dist[1] = 0, q.push(1), st[1] = true; while (q.size())
{
int t = q.front(); q.pop();
st[t] = false ; for (int i = h[t]; ~i; i = ne[i])
{
int j = e[i], W = (w[i] > x);
if (dist[j] > dist[t] + W)
{
dist[j] = dist[t] + W;
if (!st[j]) q.push(j), st[j] = true ;
}
}
} return dist[n] <= k;
} int main()
{
scanf("%d%d%d", &n, &m, &k); memset(h, -1, sizeof h);
while (m -- )
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w), add(v, u, w);
} int l = 0, r = 1e6 + 1;
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
if (r == 1e6 + 1) r = -1;
printf("%d\n", r); return 0;
}

关于时间

\(AcWing:Dijkstra\ 150ms,双端队列BFS\ \ 56ms,SPFA\ 63ms\)

\(Luogu:Dijkstra\ 238ms, 双端队列BFS\ 73ms, SPFA\ 89ms\)

Accepted!

AcWing340通信道路/ USACO2008 Telephone Line S的更多相关文章

  1. BZOJ1610: [Usaco2008 Feb]Line连线游戏

    1610: [Usaco2008 Feb]Line连线游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1301  Solved: 571[Submit ...

  2. BZOJ 1610: [Usaco2008 Feb]Line连线游戏

    1610: [Usaco2008 Feb]Line连线游戏 Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 &l ...

  3. 1610: [Usaco2008 Feb]Line连线游戏

    1610: [Usaco2008 Feb]Line连线游戏 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1396  Solved: 615 [Subm ...

  4. [bzoj1610][Usaco2008 Feb]Line连线游戏_暴力枚举

    Line连线游戏 bzoj-1610 Usaco-2008 Feb 题目大意:Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= ...

  5. [Usaco2008 Feb]Line连线游戏[暴力][水题]

    Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i ...

  6. 【BZOJ】1610: [Usaco2008 Feb]Line连线游戏(几何)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1610 两种做法,一种计算几何,一种解析几何,但是计算几何的复杂度远远搞出解析集合(虽然精度最高) 计 ...

  7. 【计算几何】【斜率】bzoj1610 [Usaco2008 Feb]Line连线游戏

    枚举直线,计算斜率,排序,统计答案. #include<cstdio> #include<cmath> #include<algorithm> using name ...

  8. [BZOJ1610] [Usaco2008 Feb] Line连线游戏 (set)

    Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i ...

  9. 【BZOJ】1610: [Usaco2008 Feb]Line连线游戏

    [算法]计算几何 [题解]计算所有斜率排序去重. 实数判断相等用fabs(...)≤eps. ★斜率题一定要注意斜率不存在的情况!!! 其实我觉得这份代码可以hack的…… #include<c ...

  10. bzoj1610 [Usaco2008 Feb]Line连线游戏 几何+暴力

    Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i ...

随机推荐

  1. CF600E Lomsat gelral (线段树合并)

    相当于是线段树合并的模板题,比(雨天的尾巴)还要板. 唯一注意的是线段树的更新,因为同一子树中可能有多种颜色占主导地位,要输出编号和,比如一颗子树中,1出现3次(最多),3出现3次,那么应该输出4. ...

  2. POJ1651 Multiplication Puzzle (区间DP)

    这道题的妙处在于把原问题看成矩阵连乘问题,求这些矩阵相乘的最小乘法次数,比如一个i*k矩阵乘一个k*j的矩阵,他们的乘法次数就是i*k*j (联想矩阵乘法的三层循环),题目说的取走一张牌,类似于矩阵相 ...

  3. C++编程范式(函数)

    1 // 2 // main.cpp 3 // test 4 // 5 // Created by Shaojun on 30/5/2020. 6 // Copyright 2020 Shaojun. ...

  4. Goland Socket 服务

    客户端发送消息 并接收服务端消息 package main import ( "fmt" "net" ) func main() { // conn, err ...

  5. JVM、JDK、JRE你分的清吗

    JVM.JDK.JRE你分的清吗 前言 在我们学习Java的时候,就经常听到"需要安装JDK"."运行需要JRE"."JVM调优"等等,这里 ...

  6. 论文解读(GLA)《Label-invariant Augmentation for Semi-Supervised Graph Classification》

    论文信息 论文标题:Label-invariant Augmentation for Semi-Supervised Graph Classification论文作者:Han Yue, Chunhui ...

  7. Linux之Docker-01

    一.镜像基础命令 1.docker version  [root@DY-Ubuntu-01 ~]#docker version               #查看 Docker 版本 2.docker ...

  8. Kafka 架构和原理机制 (图文全面详解)

    目录 一:Kafka 简介 二:Kafka 基本架构 三:Kafka 基本原理 四:Zookeeper 在 kafka 的作用 五:Kafka 的特性 六:Kafka 的应用场景 一:Kafka 简介 ...

  9. 三、Ocelot请求聚合与负载均衡

    上一篇文章介绍了在.Net Core中如何使用Ocelot:https://www.cnblogs.com/yangleiyu/p/16847439.html 本文介绍在ocelot的请求聚合与负载均 ...

  10. ES6学习笔记(十四)module的简单使用

    1.前言 module模块机制是es6新引入的,它解决了作用域的问题,使代码更加规范和结构化. 下面简单的使用一下. 2.基本使用 2.1 模块和脚本的区别 模块代码运行在严格模式下,并且没有任何办法 ...