首页 > 其他分享 >题解:CF843D Dynamic Shortest Path

题解:CF843D Dynamic Shortest Path

时间:2024-12-03 17:13:38浏览次数:8  
标签:int 题解 eg Dynamic tot nx CF843D nw dis

https://www.luogu.com.cn/problem/CF843D


luogu RMJ 加油.......

如果每修改一次就 dij 复杂度 \(O(q (n + m \log n))\) 过不去的。

暴力 dij 是因为值域很大需要用到堆,带个 log,要是值域很小就可以直接分层 BFS 了……

每次增加的边权很小,求最短路增量?设 \(dis_i\) 表示这次修改前最短路,\(f_i\) 表示这次修改后最短路增量。

有 \(f_v = \min\limits_{(u,v) \in E}{dis_u + f_u + w(u,v) - dis_v}\)。

而每次修改后最大增量是小于等于 \(c\) 的,可以分层 BFS。

注意每一层可能由自己这一层转移来(因为边权为 0),所以每一层内部需要用队列。

复杂度 \(O(q(c + m + n))\)。

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int MAXN = 1e5 + 3;

struct Edge{ // 链式前向星 方便修改边权
  int to, epre, w;
}eg[MAXN];
int egtop[MAXN], tot = 0;

int ADDeg(int u, int v, int val){
  tot++, eg[tot].to = v, eg[tot].w = val;
  eg[tot].epre = egtop[u], egtop[u] = tot;
  return tot;
}

int n, m, Q, id[MAXN];
LL dis[MAXN], f[MAXN];
queue<int> p[MAXN];

void dij(){
  for(int i = 1; i <= n; i++){
    dis[i] = 1e18;
  }
  priority_queue<pair<LL, int>> pq;
  dis[1] = 0, pq.push({0, 1});
  while(!pq.empty()){
    pair<LL, int> w = pq.top();
    int i = w.second;
    pq.pop();
    if(dis[i] < -w.first) continue;
    for(int e = egtop[i]; e > 0; e = eg[e].epre){
      int nx = eg[e].to;
      LL nw = dis[i] + eg[e].w;
      if(dis[nx] > nw) dis[nx] = nw, pq.push({-nw, nx});
    }
  }
}

int main(){
  ios::sync_with_stdio(0), cin.tie(0); 
  cin >> n >> m >> Q;
  for(int i = 1, U, V, W; i <= m; i++){
    cin >> U >> V >> W, id[i] = ADDeg(U, V, W);
  }
  dij();
  for(int q = 1, op, c, v; q <= Q; q++){
    cin >> op >> c;
    if(op == 1){
      cout << (dis[c] >= 1e18 ? -1 : dis[c]) << "\n";
    }else{
      for(int _c = 0; _c < c; _c++){
        cin >> v, eg[id[v]].w++;
      }
      for(int i = 1; i <= n; i++) f[i] = c + 1;
      f[1] = 0, p[0].push(1);
      for(int d = 0; d <= c; d++){
        while(!p[d].empty()){
          int x = p[d].front();
          p[d].pop();
          if(f[x] < d) continue;
          for(int e = egtop[x]; e > 0; e = eg[e].epre){
            int nx = eg[e].to;
            LL nw = dis[x] + f[x] + eg[e].w - dis[nx];
            if(nw < f[nx]) f[nx] = nw, p[nw].push(nx);
          }
        }
      }
      for(int i = 1; i <= n; i++) dis[i] += f[i];
      for(int d = 0; d <= c; d++){
        while(!p[d].empty()) p[d].pop();
      }
    }
  }
  return 0; 
}

标签:int,题解,eg,Dynamic,tot,nx,CF843D,nw,dis
From: https://www.cnblogs.com/huangqixuan/p/18584526

相关文章

  • 题解:AT_abc356_f [ABC356F] Distance Component Size Query
    https://www.luogu.com.cn/problem/AT_abc356_f前言纪念我场上WA8发没调出来,最后发现是1e18的问题。题目传送门:[ABC356F]DistanceComponentSizeQuery。不会线段树分治怎么办???那就用set+01-trie。思路一个联通块内的元素在值域上也是连续的,考虑维护一个联通快内......
  • 题解:CF1827C Palindrome Partition
    CF1827CPalindromePartition题解题面题目传送门。称一个字符串是好的,当且仅当它是一个长度为偶数的回文串或由若干长度为偶数的回文串拼接而成。给定一个长度为\(n\)的字符串\(s\),求有多少\(s\)的子串是好的。$1\len\le5\cdot10^5\(,\)s$仅包含小写字母。与......
  • 题解:CF1968G2 Division + LCP (hard version)
    https://www.luogu.com.cn/problem/CF1968G2CF1968G2Division+LCP(hardversion)题解前言这题可以\(O(n\sqrt{n}\logn)\)再各种优化做,算法是二分、哈希(不知道包不包含根号分治,但是有用到根号分治的思想)。如果读题解有些抽象的话可以看代码辅助理解。题意转化由于......
  • 题解:P10217 [省选联考 2024] 季风
    P10217[省选联考2024]季风题解题目传送门。初步化简题目注:本篇题解的所有下标均从\(1\)开始。设\(sumx_h\)表示\(\sum_{i=1}^{h}{x_i}\),\(sumy_i\)表示\(\sum_{i=1}^{h}{y_i}\)。于是题目给出的三个公式可以转化为:\((\sum_{i=1}^{m}{x_{i}^{′}})+sumx_{[(m-1......
  • 题解:AT_abc282_h [ABC282Ex] Min + Sum
    [ABC282Ex]Min+Sum题解题面传送门。题目要求有多少对\((l,r)\)满足\(1\lel\ler\len\)且\(\sum_{i=l}^{r}{b_i}+\min_{i=l}^{r}{a_i}\leS\)。考虑CDQ分治,那么我们需要不断寻找有多少对\((l,r)\)满足\(L\lel\leM<r\leR\)且\(\sum_{i=l}^{r}{b......
  • 【Mysql 数据库 undo log 文件无限膨胀,性能下降问题解决方案】
    数据库undolog文件无限膨胀,性能下降问题解决方案1.问题描述在Mysql数据目录中发现有个undo文件非常大,并且持续增长并且Historylistlength非常大------------TRANSACTIONS------------Trxidcounter3569860310Purgedonefortrx'sn:o<3185146100......
  • CentOS7 yum 安装 提示 网络问题解决办法
    1.sudovi/etc/yum.repos.d/CentOS-Base.repo2.将里边文件替换(insert%d  清除所有内容)  [base]name=CentOS-$releasever-Base-Aliyunbaseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=http://mirrors.aliyun.com/centos/RP......
  • 牛客周赛 Round 70题解
    牛客周赛Round70题解A小苯晨跑#include<bits/stdc++.h>usingnamespacestd;voidsolve(){inta[4];for(inti=0;i<4;i++)cin>>a[i];sort(a,a+4);if(a[0]==a[3]){cout<<"NO\n";}els......
  • 宇视网络摄像机IPC通过国标28181协议,无法接入国产系统部署的视频接入汇聚平台的问题解
    目录一.客户问题具体描述二.问题解决过程2.1网络排查2.2检查摄像机本身设置三.问题排查结果3.1平台查看设备是否在线3.2设置相关观看权限3.2.1新增并设置相关资源组3.2.2设置需要观看视频的角色3.2.3设置客户端登录用户3.3最终观看结果四.补充知识4.1ping的相关知......
  • 题解:P11217 【MX-S4-T1】「yyOI R2」youyou 的垃圾桶
    链接https://www.luogu.com.cn/problem/P11217分析先不考虑维护垃圾桶的攻击力,假设我们已经知道了所有垃圾桶的攻击力。翻倍操作可以用左移(<<)实现。首先先计算出所有垃圾桶的伤害值,然后看看能抗几个整轮。然后考虑不能抗的情况。由于所有垃圾桶的攻击力都为正数,所以可以二......