Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <map>
- #include <string>
- #include <set>
- #include <algorithm>
- #include <queue>
- using namespace std;
- typedef long long ll;
- int main() {
- int t;
- cin >> t;
- while (t--) {
- int n, m, a, b;
- cin >> n >> m >> a >> b;
- vector<vector<int> > v;
- vector<int> vec;
- v.insert(v.begin(),n+10,vec);
- for (int i = 0; i < m; i++) {
- int c,d;
- cin >> c >> d;
- v[c].push_back(d);
- v[d].push_back(c);
- }
- vector<int> vk;
- if (t == 2) {
- int kk = 0;
- }
- int kkk = 0;
- while (1 == 1) {
- kkk++;
- vector<int> dp(n + 10, -1);
- vector<int> vs(n+10,0);
- for (int i = 0; i < vk.size(); i++) {
- vs[vk[i]] = true;
- }
- vs[a] = true;
- queue<int> qi;
- qi.push(a);
- while (!qi.empty()) {
- int t = qi.front();
- qi.pop();
- for (int i = 0; i < v[t].size(); i++) {
- if (kkk > 1 && t == a && v[t][i] == b) {
- continue;
- }
- if (vs[v[t][i]] == 0) {
- dp[v[t][i]] = t;
- qi.push(v[t][i]);
- vs[v[t][i]] = true;
- }
- }
- }
- if (dp[b] == -1) {
- break;
- }
- int k = b;
- while (k != a) {
- k = dp[k];
- vk.push_back(k);
- }
- }
- if (vk.size() == 0) {
- cout<<0<<endl;
- continue;
- }
- vector<int> vis(n+10,0);
- vis[a] = true;
- vis[b] = true;
- for (int i = 0; i < vk.size(); i++) {
- queue<int> qi;
- qi.push(vk[i]);
- while (!qi.empty()) {
- int t = qi.front();
- qi.pop();
- if (vis[t])
- continue;
- vis[t] = true;
- for (int j = 0; j < v[t].size(); j++) {
- if (vis[v[t][j]] == 0) {
- qi.push(v[t][j]);
- }
- }
- }
- }
- int br1 = 0;
- queue<int> qi;
- while (!qi.empty())
- qi.pop();
- qi.push(a);
- vis[a] = false;
- vis[b] = true;
- while (!qi.empty()) {
- int t = qi.front();
- qi.pop();
- if (vis[t])
- continue;
- vis[t] = true;
- br1++;
- for (int i = 0; i < v[t].size(); i++) {
- if (vis[v[t][i]] == 0) {
- qi.push(v[t][i]);
- }
- }
- }
- while (!qi.empty())
- qi.pop();
- vis[b] = false;
- vis[a] = true;
- qi.push(b);
- int br2 = 0;
- while (!qi.empty()) {
- int t = qi.front();
- qi.pop();
- if (vis[t])
- continue;
- vis[t] = true;
- br2++;
- for (int i = 0; i < v[t].size(); i++) {
- if (vis[v[t][i]] == 0) {
- qi.push(v[t][i]);
- }
- }
- }
- br1--;
- br2--;
- ll br = (ll)br1 * (ll)br2;
- cout<<br<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement