博客
关于我
G. Reducing Delivery Cost(思维+最短路)
阅读量:242 次
发布时间:2019-03-01

本文共 2202 字,大约阅读时间需要 7 分钟。

如何优化处理免费边对最短路径的影响

在处理图中存在免费边的情况下,找到所有点对的最短路径是一个具有挑战性的任务。传统的方法可能需要对每条边进行暴力枚举,然后针对每个点进行Dijkstra算法,这种方法的时间复杂度通常较高。以下是一种优化的方法,能够有效地处理这种情况,同时减少计算量。

方法概述

我们提出了一种基于预处理的方法,通过分析每条边对各个点对的最短路径的影响,来找到最优解。具体步骤如下:

  • 预处理每个点的最短路径:对于图中的每个点,使用Dijkstra算法计算其到所有其他点的最短路径。这样可以得到一个全面的距离矩阵。

  • 分析每条边的影响:对于每条边(a, b),我们需要分析其对不同点对的最短路径的影响。具体分为以下三种情况:

    • 情况1:边(a, b)不在任何点对的最短路径上,添加后仍然不在任何最短路径上。
    • 情况2:边(a, b)不在原来的最短路径上,但添加后可能进入另一个最短路径。
    • 情况3:边(a, b)原本就在某些点对的最短路径上,添加后可能改变这些点对的最短路径。
  • 计算最小值:对于每条边,计算其对所有点对的最短路径的影响,然后取最小值作为最终结果。

  • 这种方法的时间复杂度为O(mk + n² log m),其中m是边的数量,n是点的数量,k是需要处理的点对数量。这比传统的暴力枚举方法更高效。

    具体实现步骤

  • 预处理最短路径:使用Dijkstra算法对图中的每个点进行一次计算,得到一个距离矩阵f[i][j],表示点i到点j的最短路径距离。

  • 遍历每条边:对于每条边(a, b),考虑其对点对的最短路径的影响。具体来说,对于每条边,计算其对所有点对的最短路径的影响,然后更新最终的最短路径距离。

  • 更新最终结果:对于每条边,计算其对所有点对的最短路径的影响,然后取最小值作为最终结果。

  • 代码示例

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define debug(a) cout << a << endl;using namespace std;const int maxn = 1e3 + 100;typedef long ll;typedef pair
    P;LL n, m, k, start;struct edge { LL to, cost;};vector
    g[maxn];vector
    > Edge;void dijkstra() { LL s = start; memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); dis[s] = 0; priority_queue
    , greater

    > que; que.push({0, s}); while (!que.empty()) { P p = que.top(); que.pop(); LL v = p.second; if (vis[v]) continue; vis[v] = 1; for (LL i = 0; i < g[v].size(); i++) { edge e = g[v][i]; if (dis[e.to] > dis[v] + e.cost) { dis[e.to] = dis[v] + e.cost; que.push({dis[e.to], e.to}); } } } for (LL j = 1; j <= n; j++) { f[s][j] = dis[j]; }}int main() { cin.tie(0); std::ios::sync_with_stdio(false); cin >> n >> m >> k; vector

    > v; for (LL i = 1; i <= k; i++) { LL a, b; cin >> a >> b; v.push_back({a, b}); } for (LL i = 1; i <= n; i++) { start = i; dijkstra(); } LL sum = 1e18; for (auto i : Edge) { LL a = i.first, b = i.second; LL ans = 0; for (auto j : v) { LL u = j.first, w = j.second; LL option1 = f[u][u] + f[u][a] + f[w][b]; LL option2 = f[u][u] + f[u][b] + f[w][a]; ans += min(f[u][w], option1, option2); } sum = min(sum, ans); } cout << sum << endl;}

    总结

    通过预处理每个点的最短路径,并分析每条边对点对的最短路径的影响,我们可以有效地找到图中所有点对的最短路径,即使存在大量免费边的情况。这种方法的时间复杂度优于传统的暴力枚举方法,使得处理大规模图问题更加高效。

    转载地址:http://twct.baihongyu.com/

    你可能感兴趣的文章
    Plotly-Dash:如何过滤具有多个数据框列的仪表板?
    查看>>
    Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?
    查看>>
    Plotly:如何从 x 轴删除空日期?
    查看>>
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>
    Plotly:如何使用 updatemenus 更新一个特定的跟踪?
    查看>>
    Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?
    查看>>
    Plotly:如何向烛台图添加交易量
    查看>>
    Plotly:如何在 plotly express 中找到趋势线的系数?
    查看>>
    Plotly:如何在桑基图中设置节点位置?
    查看>>
    Plotly:如何处理重叠的颜色条和图例?
    查看>>
    Plotly:如何手动设置 plotly express 散点图中点的颜色?
    查看>>
    Plotly:如何结合 make_subplots() 和 ff.create_distplot()?
    查看>>
    Plotly:如何绘制累积的“步骤“;直方图?
    查看>>
    Quartz进一步学习与使用
    查看>>
    Plotly条形图-根据正/负值更改颜色-python
    查看>>
    PLSQL developer12安装图解
    查看>>