Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define F first
- #define S second
- #define pb push_back
- using namespace std;
- typedef long long ll;
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define ordered_set tree<pair<ll,int>, null_type,less<pair<ll,int>>, rb_tree_tag,tree_order_statistics_node_update>
- const int INF = 1e8;
- const int mxN = 2e5 + 9;
- const int mxK = 2e2 + 9;
- const int MOD = 1000000007;
- vector <int> adj[mxN];
- void solve () {
- int n;
- cin >> n;
- int m;
- cin >> m;
- int s, t;
- cin >> s >> t;
- for (int i = 1; i <= m; i++) {
- int u, v;
- cin >> u >> v;
- adj[u].pb (v);
- adj[v].pb (u);
- }
- vector <int> dist (n + 1, INF);
- vector <vector <int>> dp (n + 1, vector <int> (2, 0));
- queue <pair <int, int> > q;
- q.push ({s, 0});
- dist[s] = 0;
- dp[s][0] = 1;
- while (!q.empty ()) {
- auto [v, diff] = q.front();
- q.pop();
- for (auto u: adj[v]) {
- if (diff) {
- if (dist[v] + 1 == dist[u]) {
- if (dp[v][1] == 0)
- q.push ({u, 1});
- dp[u][1] += dp[v][1];
- }
- } else {
- if (dist[v] + 1 < dist[u]) {
- dist[u] = dist[v] + 1;
- dp[u][0] += dp[v][0];
- q.push ({u, 0});
- } else if (dist[v] + 1 == dist[u]) {
- dp[u][0] += dp[v][0];
- } else if (dist[v] == dist[u]) {
- dp[u][1] += dp[v][0];
- q.push ({u, 1});
- }
- }
- }
- }
- //cout << dp[t][0] << ' ' << dp[t][1] << "\n";
- cout << dp[t][0] + dp[t][1] << "\n";
- for (int i = 1; i <= n; i++)
- adj[i].clear();
- return;
- }
- int main () {
- int t = 1;
- cin >> t;
- //preCalc ();
- while (t--) {
- solve ();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement