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



目录
相关文章
|
机器学习/深度学习 人工智能 Java
2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 哗啦啦村袭击了喵哈哈村! 度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。
1645 0
|
机器学习/深度学习 人工智能 BI
“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O
黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个像素点或者是黑色的或者是白色的。
1368 0
|
存储 定位技术 C++
【PTA】龙舌兰酒吧 (BFS求双源最短路)
【PTA】龙舌兰酒吧 (BFS求双源最短路)
187 0
【PTA】龙舌兰酒吧 (BFS求双源最短路)
(数论)蓝桥杯AcWing 1205. 买不到的数目
(数论)蓝桥杯AcWing 1205. 买不到的数目
63 0
|
8月前
蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组
蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组
|
边缘计算 缓存 算法
LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd
昨晚是 LeetCode 双周赛第 102 场,你参加了吗?这场比赛比较简单,拼的是板子手速,继上周掉大分后算是回了一口血 😁。
120 0
|
算法
贪心算法——小船过河
贪心算法——小船过河
418 0
贪心算法——小船过河
洛谷P1616-疯狂的采药(完全背包)
洛谷P1616-疯狂的采药(完全背包)

热门文章

最新文章