Advertisement
Fshl0

Untitled

Mar 9th, 2022
789
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. #define pb push_back
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8.  
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11. using namespace __gnu_pbds;
  12.  
  13. #define ordered_set tree<pair<ll,int>, null_type,less<pair<ll,int>>, rb_tree_tag,tree_order_statistics_node_update>
  14.  
  15. const int INF = 1e8;
  16. const int mxN = 2e5 + 9;
  17. const int mxK = 2e2 + 9;
  18. const int MOD = 1000000007;
  19.  
  20. vector <int> adj[mxN];
  21.  
  22. void solve () {
  23.     int n;
  24.     cin >> n;
  25.    
  26.     int m;
  27.     cin >> m;
  28.    
  29.     int s, t;
  30.     cin >> s >> t;
  31.    
  32.     for (int i = 1; i <= m; i++) {
  33.         int u, v;
  34.         cin >> u >> v;
  35.        
  36.         adj[u].pb (v);
  37.         adj[v].pb (u);
  38.     }
  39.    
  40.     vector <int> dist (n + 1, INF);
  41.     vector <vector <int>> dp (n + 1, vector <int> (2, 0));
  42.    
  43.     queue <pair <int, int> > q;
  44.     q.push ({s, 0});
  45.    
  46.     dist[s] = 0;
  47.     dp[s][0] = 1;
  48.    
  49.     while (!q.empty ()) {
  50.         auto [v, diff] = q.front();
  51.         q.pop();
  52.        
  53.         for (auto u: adj[v]) {
  54.             if (diff) {
  55.                 if (dist[v] + 1 == dist[u]) {
  56.                     if (dp[v][1] == 0)
  57.                         q.push ({u, 1});
  58.                    
  59.                     dp[u][1] += dp[v][1];
  60.                 }
  61.             } else {
  62.                 if (dist[v] + 1 < dist[u]) {
  63.                     dist[u] = dist[v] + 1;
  64.                     dp[u][0] += dp[v][0];
  65.                    
  66.                     q.push ({u, 0});
  67.                 } else if (dist[v] + 1 == dist[u]) {
  68.                     dp[u][0] += dp[v][0];
  69.                 } else if (dist[v] == dist[u]) {
  70.                     dp[u][1] += dp[v][0];
  71.                        
  72.                     q.push ({u, 1});
  73.                 }
  74.             }
  75.         }
  76.     }
  77.  
  78.    
  79.     //cout << dp[t][0] << ' ' << dp[t][1] << "\n";
  80.     cout << dp[t][0] + dp[t][1] << "\n";
  81.    
  82.     for (int i = 1; i <= n; i++)
  83.         adj[i].clear();
  84.    
  85.     return;
  86. }
  87.  
  88. int main () {
  89.     int t = 1;
  90.     cin >> t;
  91.        
  92.     //preCalc ();
  93.     while (t--) {
  94.         solve ();
  95.     }
  96.        
  97.     return 0;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement