1 条题解

  • 0
    @ 2025-10-20 15:21:12

    问题分析 题目要求计算有向图 GG 的函数 h(G)h(G),其中 h(G)h(G) 定义为所有顶点 uu 的函数值 f(u,G)f(u, G) 之和。函数 f(u,G)f(u, G) 的计算过程涉及按顺序检查顶点 vv 是否与 uu 双向可达,并在满足条件时删除顶点 vv

    关键观察 通过分析函数 f(u,G)f(u, G) 的计算过程,可以发现:

    点对 (i,j)(i, j)(其中 iji \leq j)会对 h(G)h(G) 产生贡献,当且仅当在图中存在从 iijj 和从 jjii 的路径,且路径上所有顶点的编号都不小于 ii

    将问题转化为对点对的贡献计数,可以简化计算。

    核心思路 定义关键变量:设 T(i,j)T(i, j) 表示使得 iijj 双向连通的最大边权(即边编号)的最小值。这里边权定义为边的输入顺序编号。

    动态规划计算:使用类 Floyd 算法,从大到小枚举中间顶点 kk,更新所有点对 (i,j)(i, j)T(i,j)T(i, j) 值。通过这种方式,可以高效地计算出所有点对的双向连通性。

    贡献统计:对于每个点对 (i,j)(i, j),若 T(i,j)T(i, j) 存在,则它对所有删除边数小于 T(i,j)T(i, j) 的图 GtG_t 产生贡献。通过后缀和技巧,可以快速计算出所有 h(Gt)h(G_t) 的值。

    算法流程 初始化 dd 数组,存储点对间的最大边权。

    nn11 逆序枚举中间顶点 kk,更新所有点对的 d[i][j]d[i][j] 值。

    对于每个点对 (j,k)(j, k)jkj \geq k),根据 d[j][k]d[j][k]d[k][j]d[k][j] 的最小值确定其贡献的边范围。

    使用后缀和数组 hh 统计贡献,最终输出所有 h(Gt)h(G_t) 的值。

    复杂度分析 时间复杂度:O(n3)O(n^3),主要来源于三重循环的 Floyd 算法。

    空间复杂度:O(n2)O(n^2),用于存储点对间的边权信息。

    • 1

    信息

    ID
    3589
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者