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
**/



目录
打赏
0
0
0
0
5
分享
相关文章
【每日一题Day125】LC1326灌溉花园的最少水龙头数目 | 动态规划 贪心
【每日一题Day125】LC1326灌溉花园的最少水龙头数目 | 动态规划 贪心
75 0
【广度优先搜索】【分类讨论】900. 最佳运动员的比拼回合
【广度优先搜索】【分类讨论】900. 最佳运动员的比拼回合
PTA之N个数求和(细节题)天梯赛
编程题,要求计算以分子/分母形式给出的一组有理数的和,输出结果也要是最简有理数形式。输入包含正整数N(N≤100)及N个有理数,输出为和的最简形式。示例:输入5个数2/5, 4/15, 1/30, -2/60, 8/3,输出3 1/3;输入2个数4/3, 2/3,输出2。代码中包含求最大公约数的函数和计算有理数和的主要逻辑。
86 0
|
11月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
111 0
PTA 7-2 找奇葩 (20 分)
在一个长度为 n 的正整数序列中,所有的奇数都出现了偶数次,只有一个奇葩奇数出现了奇数次。你的任务就是找出这个奇葩。
157 0
|
11月前
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
46 0
第十四届蓝桥杯省赛JavaB组试题E【蜗牛】Dijkstra堆优化 or 线性DP?
第十四届蓝桥杯省赛JavaB组试题E【蜗牛】Dijkstra堆优化 or 线性DP?
196 0
第十四届蓝桥杯省赛JavaB组试题E【蜗牛】Dijkstra堆优化 or 线性DP?
测量学的几道简答题
测量学的几道简答题
79 0
C++/PTA 球队“食物链”
某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。
141 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
大西洋太平洋水流问题 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
201 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)

热门文章

最新文章

相关实验场景

更多
目录
目录