返回

LeetCode周赛T4虐爆程序员, 堪称史上最难, 仅68人过关, 附源码!

闲谈

史上最难LeetCode周赛T4题,只有68人过关!

大家好,我是算法工程师Peter,也是一名LeetCode的资深粉丝。今天,我要跟大家分享一道非常难的LeetCode周赛题目:周赛 346(2023/05/21)的 T4 题。这道题考察了选手对最短路算法的理解和应用能力,全国仅有 68 人 AK。

题目概述

给定一个无向图,其中每个节点都有一个权重。求从起点到终点的最短路径,使得路径上的权重总和最小。

解题思路

这道题的关键在于理解最短路算法。最短路算法有很多种,比如 Dijkstra 算法、Floyd-Warshall 算法、Bellman-Ford 算法等。每种算法都有其特点和适用场景。

对于这道题,我们可以使用 Dijkstra 算法。Dijkstra 算法是一种贪心算法,它从起点开始,不断扩展最短路径,直到找到终点。

代码实现

下面用 C++ 语言实现 Dijkstra 算法:

#include <vector>
#include <queue>

using namespace std;

const int INF = 1e9;

struct Edge {
  int to;
  int weight;
};

struct Node {
  int id;
  int dist;
};

bool operator<(const Node& a, const Node& b) {
  return a.dist > b.dist;
}

vector<vector<Edge>> graph;
vector<int> dist;
vector<bool> visited;

void Dijkstra(int start) {
  dist[start] = 0;
  priority_queue<Node> pq;
  pq.push({start, 0});

  while (!pq.empty()) {
    Node node = pq.top();
    pq.pop();

    int id = node.id;
    int dist = node.dist;

    if (visited[id]) {
      continue;
    }

    visited[id] = true;

    for (Edge edge : graph[id]) {
      int to = edge.to;
      int weight = edge.weight;

      if (dist + weight < dist[to]) {
        dist[to] = dist + weight;
        pq.push({to, dist + weight});
      }
    }
  }
}

算法流程

  1. 初始化最短路径数组 dist 和访问标志数组 visited。
  2. 调用 Dijkstra 函数计算从起点到所有其他节点的最短路径。
  3. 输出从起点到终点的最短路径长度。

总结

这道题是一道非常有挑战性的题目,它考察了选手对最短路算法的理解和应用能力。通过解决这道题,选手可以加深对最短路算法的理解,并提高自己的算法编程能力。

常见问题解答

1. 为什么使用 Dijkstra 算法?

Dijkstra 算法适用于求解非负权重的无向图的最短路径问题。这道题满足这些条件。

2. 如何判断是否存在最短路径?

如果从起点到终点的最短路径长度为 INF,则表示不存在最短路径。

3. 如何优化 Dijkstra 算法?

可以使用斐波那契堆或二叉堆优化 Dijkstra 算法,以提高效率。

4. 有哪些其他最短路算法?

除了 Dijkstra 算法之外,还有 Floyd-Warshall 算法、Bellman-Ford 算法、A* 算法等最短路算法。

5. 如何应用最短路算法到实际问题中?

最短路算法在导航、物流、网络路由等领域都有广泛的应用。