Advertisement
Guest User

shortestpath2.cpp

a guest
Jun 18th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 2e5 + 5;
  5. const int mod = 1e9 + 7;
  6. vector<pair<int, int>> g[maxn], r[maxn];
  7. long long d[2][maxn];
  8. int u[maxn], v[maxn], w[maxn], way[2][maxn], dfn[maxn], low[maxn];
  9.  
  10. template <typename T>
  11. using heap = priority_queue<T, vector<T>, greater<T>>;
  12.  
  13. void dijk(int s, vector<pair<int, int>> *g, int n) {
  14.     static bool used[maxn];
  15.     for (int i = 0; i < n; ++i) {
  16.         used[i] = false;
  17.         d[s][i] = 1e18;
  18.     }
  19.  
  20.     heap<pair<long long, int>> pq;
  21.     pq.emplace(0, s);
  22.     d[s][s] = 0;
  23.     way[s][s] = 1;
  24.  
  25.     while (!pq.empty()) {
  26.         int x = pq.top().second;
  27.         pq.pop();
  28.         if (used[x]) continue;
  29.  
  30.         used[x] = true;
  31.         for (int i = 0; i < (int)g[x].size(); ++i) {
  32.             int u = g[x][i].first;
  33.             int w = g[x][i].second;
  34.             if (d[s][u] > d[s][x] + w) {
  35.                 d[s][u] = d[s][x] + w;
  36.                 way[s][u] = way[s][x];
  37.                 pq.emplace(d[s][u], u);
  38.             } else if (d[s][u] == d[s][x] + w) {
  39.                 (way[s][u] += way[s][x]) %= mod;
  40.             }
  41.         }
  42.     }
  43. }
  44.  
  45. int dfs2(int x, int p) {
  46.     static int tk = 0;
  47.     dfn[x] = low[x] = tk++;
  48.     int res = 0;
  49.  
  50.     for (int i = 0; i < (int)g[x].size(); ++i) {
  51.         int u = g[x][i].first;
  52.         if (u == p) continue;
  53.  
  54.         if (dfn[u] == -1) {
  55.             res += dfs2(u, x);
  56.             low[x] = min(low[x], low[u]);
  57.         } else {
  58.             low[x] = min(low[x], dfn[u]);
  59.         }
  60.     }
  61.  
  62.     if (low[x] == dfn[x] && p != -1) ++res;
  63.     return res;
  64. }
  65.  
  66. int main() {
  67.     int n, m; scanf("%d%d", &n, &m);
  68.     for (int i = 0; i < m; ++i) {
  69.         scanf("%d%d%d", &u[i], &v[i], &w[i]);
  70.         --u[i], --v[i];
  71.         g[u[i]].emplace_back(v[i], w[i]);
  72.         r[v[i]].emplace_back(u[i], w[i]);
  73.     }
  74.  
  75.     dijk(0, g, n);
  76.     dijk(1, r, n);
  77.  
  78.     printf("%lld\n", d[0][1]);
  79.     printf("%d\n", way[0][1]);
  80.  
  81.     for (int i = 0; i < n; ++i) g[i].clear();
  82.     for (int i = 0; i < m; ++i) {
  83.         if (d[0][u[i]] + w[i] + d[1][v[i]] == d[0][1]) {
  84.             g[u[i]].emplace_back(v[i], w[i]);
  85.             g[v[i]].emplace_back(u[i], w[i]);
  86.         }
  87.     }
  88.  
  89.     for (int i = 0; i < n; ++i) dfn[i] = -1;
  90.     printf("%d\n", dfs2(0, -1));
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement