109712024-04-23 16:01:46k_balintÚtvonalakcpp17Accepted 100/100333ms154584 KiB
#include <bits/stdc++.h>
using namespace std;
const int c=3e5+5;
const int ce=1e6+6;

int n,m,q,tt,K;
vector<int> adj[c];
bool volt[ce], vis[c];
int vag[c], t[c], l[c], cnt[c], dep[c];
int mp[c];
vector<vector<int>> comp;
vector<pair<int,int>> s;
vector<int> tree[c];

void dfs(int v, int p){
    t[v]=l[v]=++tt;
    int vag1=0;
    for(int x:adj[v]){
        if(x==p) continue;
        if(!t[x]){
            vag1++;
            s.push_back(make_pair(v,x));
            dfs(x,v);
            l[v]=min(l[v],l[x]);
            if(l[x]>=t[v] && p){
                if(!vag[v]) vag[v]=++K;
                comp.push_back(vector<int>());
                while(!s.empty()){
                    int a=s.back().first,b=s.back().second;
                    comp.back().push_back(a);
                    comp.back().push_back(b);
                    s.pop_back();
                    if(a==v) break;
                }
            }

            if(!p){
                comp.push_back(vector<int>());
                while(!s.empty()){
                    comp.back().push_back(s.back().first);
                    comp.back().push_back(s.back().second);
                    s.pop_back();
                }
            }
        }
        else l[v]=min(l[v],t[x]);
    }

    if(vag1>1 && !p) vag[1]=++K;
}

void build(){
    for(int i=1;i<=n;i++){
        if(vag[i]) {mp[i]=vag[i]+comp.size(); cnt[mp[i]]=-1;}
    }

    for(int i=0;i<comp.size();i++){
        vector<int> cut;
        sort(comp[i].begin(),comp[i].end());
        comp[i].resize(unique(comp[i].begin(),comp[i].end())-comp[i].begin());
        cnt[i+1]=comp[i].size();

        for(int x:comp[i])
        {
            if(!vag[x]) mp[x]=i+1;
            else {
                cut.push_back(x);
                tree[i+1].push_back(mp[x]);
                tree[mp[x]].push_back(i+1);
            }
        }
    }
}

int up[c][19];
int sum[c][19];

void dfs2(int v, int p){
    up[v][0]=p;
    sum[v][0]=cnt[v];
    for(int i=1;i<19;i++){
        int x = up[v][i-1];
        up[v][i]=up[x][i-1];
        sum[v][i]=sum[v][i-1]+sum[x][i-1];
    }

    for(int x:tree[v]){
        if(x != p){
            dep[x]=dep[v]+1;
            dfs2(x,v);
        }
    }
}

int query(int a, int b){
    int res=(vag[a]>0) + (vag[b]>0);
    a=mp[a], b=mp[b];

    if(dep[a]>dep[b]) swap(a,b);
    int k=dep[b]-dep[a];
    for(int i=18;i>=0;i--){
        if((k>>i)&1){
            res+=sum[b][i];
            b=up[b][i];
        }
    }

    if(a==b){
        res+=sum[a][0];
        return res;
    }

    for(int i=18;i>=0;i--){
        if(up[a][i] != up[b][i]){
            res+=sum[a][i]+sum[b][i];
            a=up[a][i], b=up[b][i];
        }
    }
    res+=sum[up[a][0]][0]+sum[a][0]+sum[b][0];
    return res;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m>>q;

    for(int i=1;i<=m;i++){
        int a,b; cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    dfs(1,0);
    build();
    dfs2(1,0);
    while(q--){
        int a,b; cin>>a>>b;
        cout << query(a,b)-2 << '\n';
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted14ms30128 KiB
2Accepted112ms44880 KiB
subtask215/15
3Accepted14ms30752 KiB
4Accepted17ms31236 KiB
5Accepted21ms35816 KiB
6Accepted24ms32812 KiB
7Accepted59ms38184 KiB
8Accepted108ms45728 KiB
subtask315/15
9Accepted17ms32252 KiB
10Accepted17ms33148 KiB
11Accepted21ms36260 KiB
12Accepted28ms39076 KiB
13Accepted93ms69888 KiB
14Accepted177ms108404 KiB
15Accepted330ms152876 KiB
subtask415/15
16Accepted17ms32396 KiB
17Accepted18ms32784 KiB
18Accepted21ms34248 KiB
19Accepted61ms39656 KiB
20Accepted114ms46424 KiB
subtask515/15
21Accepted14ms32344 KiB
22Accepted16ms32380 KiB
23Accepted17ms33632 KiB
24Accepted14ms32700 KiB
25Accepted14ms32804 KiB
26Accepted16ms32788 KiB
subtask640/40
27Accepted14ms32612 KiB
28Accepted114ms47112 KiB
29Accepted14ms30752 KiB
30Accepted17ms31236 KiB
31Accepted21ms35816 KiB
32Accepted24ms32812 KiB
33Accepted59ms38184 KiB
34Accepted108ms45728 KiB
35Accepted17ms32252 KiB
36Accepted17ms33148 KiB
37Accepted21ms36260 KiB
38Accepted28ms39076 KiB
39Accepted93ms69888 KiB
40Accepted177ms108404 KiB
41Accepted330ms152876 KiB
42Accepted17ms32396 KiB
43Accepted18ms32784 KiB
44Accepted21ms34248 KiB
45Accepted61ms39656 KiB
46Accepted114ms46424 KiB
47Accepted14ms32344 KiB
48Accepted16ms32380 KiB
49Accepted17ms33632 KiB
50Accepted14ms32700 KiB
51Accepted14ms32804 KiB
52Accepted16ms32788 KiB
53Accepted252ms154032 KiB
54Accepted14ms33188 KiB
55Accepted18ms37576 KiB
56Accepted24ms34864 KiB
57Accepted78ms40316 KiB
58Accepted68ms41912 KiB
59Accepted333ms154584 KiB
60Accepted142ms46224 KiB
61Accepted143ms48288 KiB
62Accepted151ms49532 KiB