10971 2024. 04. 23 16:01:46 k_balint Útvonalak cpp17 Elfogadva 100/100 333ms 154584 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';
    }
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 14ms 30128 KiB
2 Elfogadva 112ms 44880 KiB
subtask2 15/15
3 Elfogadva 14ms 30752 KiB
4 Elfogadva 17ms 31236 KiB
5 Elfogadva 21ms 35816 KiB
6 Elfogadva 24ms 32812 KiB
7 Elfogadva 59ms 38184 KiB
8 Elfogadva 108ms 45728 KiB
subtask3 15/15
9 Elfogadva 17ms 32252 KiB
10 Elfogadva 17ms 33148 KiB
11 Elfogadva 21ms 36260 KiB
12 Elfogadva 28ms 39076 KiB
13 Elfogadva 93ms 69888 KiB
14 Elfogadva 177ms 108404 KiB
15 Elfogadva 330ms 152876 KiB
subtask4 15/15
16 Elfogadva 17ms 32396 KiB
17 Elfogadva 18ms 32784 KiB
18 Elfogadva 21ms 34248 KiB
19 Elfogadva 61ms 39656 KiB
20 Elfogadva 114ms 46424 KiB
subtask5 15/15
21 Elfogadva 14ms 32344 KiB
22 Elfogadva 16ms 32380 KiB
23 Elfogadva 17ms 33632 KiB
24 Elfogadva 14ms 32700 KiB
25 Elfogadva 14ms 32804 KiB
26 Elfogadva 16ms 32788 KiB
subtask6 40/40
27 Elfogadva 14ms 32612 KiB
28 Elfogadva 114ms 47112 KiB
29 Elfogadva 14ms 30752 KiB
30 Elfogadva 17ms 31236 KiB
31 Elfogadva 21ms 35816 KiB
32 Elfogadva 24ms 32812 KiB
33 Elfogadva 59ms 38184 KiB
34 Elfogadva 108ms 45728 KiB
35 Elfogadva 17ms 32252 KiB
36 Elfogadva 17ms 33148 KiB
37 Elfogadva 21ms 36260 KiB
38 Elfogadva 28ms 39076 KiB
39 Elfogadva 93ms 69888 KiB
40 Elfogadva 177ms 108404 KiB
41 Elfogadva 330ms 152876 KiB
42 Elfogadva 17ms 32396 KiB
43 Elfogadva 18ms 32784 KiB
44 Elfogadva 21ms 34248 KiB
45 Elfogadva 61ms 39656 KiB
46 Elfogadva 114ms 46424 KiB
47 Elfogadva 14ms 32344 KiB
48 Elfogadva 16ms 32380 KiB
49 Elfogadva 17ms 33632 KiB
50 Elfogadva 14ms 32700 KiB
51 Elfogadva 14ms 32804 KiB
52 Elfogadva 16ms 32788 KiB
53 Elfogadva 252ms 154032 KiB
54 Elfogadva 14ms 33188 KiB
55 Elfogadva 18ms 37576 KiB
56 Elfogadva 24ms 34864 KiB
57 Elfogadva 78ms 40316 KiB
58 Elfogadva 68ms 41912 KiB
59 Elfogadva 333ms 154584 KiB
60 Elfogadva 142ms 46224 KiB
61 Elfogadva 143ms 48288 KiB
62 Elfogadva 151ms 49532 KiB