Advertisement
Guest User

shortestpath1.cpp

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