110082024-06-04 12:26:39UVinceÚtvonalakcpp17Elfogadva 100/100564ms109200 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;


void solve();

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

    int t=1;
    //cin>>t;
    while (t--) solve();
    return 0;
}

const int maxn=4e5+1;

int n,m,k;
vector<vector<int>> g(maxn);
vector<int> t(maxn, -1),l(maxn, -1);
vector<bool> vis(maxn,false);
int timer=0;
stack<int> st;
vector<vector<int>> comps;
vector<int> art(maxn);
vector<int> comp(maxn,-1);
void dfs(int v, int p=-1){
    t[v]=l[v]=++timer;
    vis[v]=true;
    st.push(v);
    for (int to : g[v]){
        if (p==to) continue;
        if (vis[to]){
            l[v]=min(l[v], t[to]);
        }
        else {
            dfs(to, v);
            l[v]=min(l[v], l[to]);

            if (l[to]>=t[v]){
                art[v]= (t[v]>1 || t[to]>2);
                comps.push_back({v});
                comp[v]=comps.size()-1;
                while (comps.back().back()!=to){
                    comps.back().push_back(st.top());
                    comp[st.top()]=comps.size()-1;
                    st.pop();
                }
            }
        }
    }
}


vector<bool> bctvis(maxn,false);
vector<vector<int>> bctg(maxn);

void bct(int v){
    bctvis[v]=true;
    if (comps[v].size()==1){
        for (int to : bctg[v]){
            if (!bctvis[to]) bct(to);
        }
    }else {
        for (int node : comps[v]){
            if (art[node]){
                bctg[v].push_back(comp[node]);
                if (!bctvis[comp[node]]) bct(comp[node]);
            }
        }
    }
}

vector<int> pr(maxn,1);
vector<vector<int>> binary(maxn, vector<int> (20, 0));
vector<int> layer(maxn, -1);

void pref(int v, int p=-1){
    pr[v]=pr[max(p,0)]-1+comps[v].size();
    layer[v]=layer[max(p,0)]+1;
    if (p!=-1){
        binary[v][0]=p;
        for (int i=1;i<20;i++){
            binary[v][i]=binary[binary[v][i-1]][i-1];
        }
    }
    for (int to : bctg[v]){
        if (to==p) continue;
        pref(to,v);
    }
}

int lca(int a,int b){
    if (layer[a]<layer[b]) swap(a,b);
    if (layer[a]>layer[b]){
        for (int i=19;i>=0;i--){
            int c=binary[a][i];
            if (layer[c]<=layer[b]) continue;
            a=c;
        }
        a=binary[a][0];
    }
    if (a==b) return a;
    for (int i=19;i>=0;i--){
        int c=binary[a][i];
        int d=binary[b][i];
        if (c==d) continue;
        a=c;
        b=d;
    }
    return binary[a][0];
}

void solve(){
    cin>>n>>m>>k;
    for (int i = 0; i < m; i++)
    {
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    dfs(1);
    for (int i=1;i<=n;i++){
        if (art[i]){
            comps.push_back({i});
            comp[i]=comps.size()-1;
        }
    }
    for (int i=0;i<comps.size();i++){
        if (comps[i].size()==1) continue;
        for (int j : comps[i]){
            if (art[j]) bctg[comp[j]].push_back(i);
        }
    }
    bct(0);
    pref(0);
    for (int i = 0; i < k; i++)
    {
        int a,b;
        cin>>a>>b;

        a=comp[a];
        b=comp[b];

        int c = lca(a,b);
        cout<<pr[a]+pr[b]-2*pr[c]+int(comps[c].size())-2<<"\n";
    }
    

}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva72ms75804 KiB
2Elfogadva150ms80224 KiB
subtask215/15
3Elfogadva93ms75580 KiB
4Elfogadva94ms75808 KiB
5Elfogadva100ms77084 KiB
6Elfogadva93ms76132 KiB
7Elfogadva112ms78076 KiB
8Elfogadva166ms80384 KiB
subtask315/15
9Elfogadva75ms75876 KiB
10Elfogadva101ms75920 KiB
11Elfogadva97ms76884 KiB
12Elfogadva104ms77364 KiB
13Elfogadva148ms83860 KiB
14Elfogadva275ms92060 KiB
15Elfogadva479ms109200 KiB
subtask415/15
16Elfogadva92ms76024 KiB
17Elfogadva101ms75896 KiB
18Elfogadva90ms76228 KiB
19Elfogadva134ms78052 KiB
20Elfogadva168ms80352 KiB
subtask515/15
21Elfogadva93ms75988 KiB
22Elfogadva94ms75660 KiB
23Elfogadva79ms76152 KiB
24Elfogadva93ms75688 KiB
25Elfogadva82ms75748 KiB
26Elfogadva75ms75748 KiB
subtask640/40
27Elfogadva75ms75664 KiB
28Elfogadva194ms80268 KiB
29Elfogadva93ms75580 KiB
30Elfogadva94ms75808 KiB
31Elfogadva100ms77084 KiB
32Elfogadva93ms76132 KiB
33Elfogadva112ms78076 KiB
34Elfogadva166ms80384 KiB
35Elfogadva75ms75876 KiB
36Elfogadva101ms75920 KiB
37Elfogadva97ms76884 KiB
38Elfogadva104ms77364 KiB
39Elfogadva148ms83860 KiB
40Elfogadva275ms92060 KiB
41Elfogadva479ms109200 KiB
42Elfogadva92ms76024 KiB
43Elfogadva101ms75896 KiB
44Elfogadva90ms76228 KiB
45Elfogadva134ms78052 KiB
46Elfogadva168ms80352 KiB
47Elfogadva93ms75988 KiB
48Elfogadva94ms75660 KiB
49Elfogadva79ms76152 KiB
50Elfogadva93ms75688 KiB
51Elfogadva82ms75748 KiB
52Elfogadva75ms75748 KiB
53Elfogadva564ms108936 KiB
54Elfogadva75ms75812 KiB
55Elfogadva79ms76900 KiB
56Elfogadva89ms76260 KiB
57Elfogadva153ms78308 KiB
58Elfogadva142ms78316 KiB
59Elfogadva483ms109100 KiB
60Elfogadva216ms80608 KiB
61Elfogadva222ms80868 KiB
62Elfogadva182ms80924 KiB