PTA 森森旅游 (30 分) | 堆优化迪杰斯特拉

简介: PTA 森森旅游 (30 分) | 堆优化迪杰斯特拉

b07ae917759c4fe0bc399153a5e77318.png

6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17


8
8
1


9b747bfb293a49ea96171b7d0ecc32f3.png


Code:


typedef pair<long long, int> PII;
int n, m, q;
int head1[maxn], head2[maxn];
ll dis1[maxn], dis2[maxn];
struct node {
  int v, to, nex;
  int w;
}e[maxn << 2];
int idx;
multiset<ll> mst;
void init() {
  idx = 0;
  memset(head1, -1, sizeof head1);
  memset(head2, -1, sizeof head2);
}
void add(int h[], int u, int v, int w) {
  e[idx].v = v;
  e[idx].nex = h[u];
  e[idx].w = w;
  h[u] = idx++;
}
bool vis[maxn];
void dij(ll dis[], int head[], int st) {
  memset(dis, 0x3f3f3f3f3f3f3f3f, sizeof dis1);
  memset(vis, 0, sizeof vis);
  priority_queue <PII, vector<PII>, greater<PII> > que;
  que.push({ 0,st });
  dis[st] = 0;
  while (que.size()) {
    int u = que.top().second;
    que.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (int i = head[u]; ~i; i = e[i].nex) {
      //  cout << e[i].v << endl;
      int to = e[i].v;
      if (dis[to] > dis[u] + e[i].w) {
        dis[to] = dis[u] + e[i].w;
        que.push({ dis[to],to });
      }
    }
  }
}
int a[maxn];
void getAns() {
  for (int i = 1; i <= n; i++) {
    if (dis1[i] == 0x3f3f3f3f3f3f3f3f) continue;
    if (dis2[i] == 0x3f3f3f3f3f3f3f3f) continue;
    ll val = dis1[i] + (dis2[i] + a[i] - 1) / a[i];
    mst.insert(val);
    // puts("add");
  }
  for (int qq = 1; qq <= q; qq++) {
    //  puts("qq");
    int x = read, aa = read;
    if (dis1[x] != 0x3f3f3f3f3f3f3f3f && dis2[x] != 0x3f3f3f3f3f3f3f3f) {
      ll t = dis1[x] + (dis2[x] + a[x] - 1) / a[x];
      mst.erase(mst.find(t));
      a[x] = aa;
      ll val = dis1[x] + (dis2[x] + aa - 1) / aa;
      mst.insert(val);
    }
    printf("%lld\n", *mst.begin());
  }
}
int main() {
  n = read, m = read, q = read;
  init();
  memset(dis1, 0x3f3f3f3f3f3f3f3f, sizeof dis1);
  memset(dis2, 0x3f3f3f3f3f3f3f3f, sizeof dis2);
  for (int i = 1; i <= m; i++) {
    int u = read, v = read, c = read, d = read;
    add(head1, u, v, c);
    add(head2, v, u, d);
  }
  for (int i = 1; i <= n; i++) a[i] = read;
  dij(dis1, head1, 1);
  dij(dis2, head2, n);
  /*
  for (int i = 1; i <= n; i++) {
    cout << dis1[i] << " " << dis2[i] << endl;
  }*/
  getAns();
  return 0;
}
/**
6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17
**/



目录
相关文章
Python函数:函数的定义和调用
本文详细介绍了Python函数的定义和调用方法,包括基本函数定义、参数传递、返回值、文档字符串、作用域、嵌套函数和闭包。通过一个综合详细的学生成绩管理系统的例子,我们展示了如何在实际编程中应用这些函数概念。希望本文对您理解和应用Python函数有所帮助。
|
机器学习/深度学习 数据挖掘
机器学习之聚类——模糊聚类FCM
机器学习之聚类——模糊聚类FCM
693 4
|
存储 SQL JSON
Hologres技术揭秘,JSON半结构化数据的极致分析性能
本文将会揭秘Hologres JSONB半结构化数据的技术原理,实现JSON半结构数据的极致分析性能。
3390 59
Hologres技术揭秘,JSON半结构化数据的极致分析性能
|
算法 Java 大数据
深入理解Go的垃圾回收机制
深入理解Go的垃圾回收机制
309 0
|
人工智能 安全 云计算
阿里云服务器购买之后发票如何申请?申请发票流程及常见问题参考
申请发票是很多用户尤其是企业级用户在购买完阿里云服务器之后非常关注的问题,对于初次购买阿里云服务器的用户来说,往往并不清楚如何找阿里云申请发票,本文以图文形式为大家介绍阿里云服务器购买完成之后申请发票的详细流程以及常见问题。
阿里云服务器购买之后发票如何申请?申请发票流程及常见问题参考
|
存储 关系型数据库 MySQL
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
|
机器学习/深度学习 人工智能 TensorFlow
2023年人工智能开源项目前20名
人工智能(AI)正在迅速成为现代世界的变革力量,开源项目在这一转型中发挥了重要作用。开源人工智能项目使尖端技术的访问民主化,鼓励该领域专家之间的合作,并能够开发复杂而强大的人工智能解决方案来解决现实世界的问题。
2641 0
|
Docker 容器
从零开始 - Docker部署前后端分离项目(四)
从零开始 - Docker部署前后端分离项目(四)
279 0
力扣第6刷-删除有序数组中的重复项
力扣第6刷-删除有序数组中的重复项
力扣第6刷-删除有序数组中的重复项